diff --git a/servers/game/data/tables.go b/servers/game/data/tables.go index 14cbd18..d1afc56 100644 --- a/servers/game/data/tables.go +++ b/servers/game/data/tables.go @@ -1,7 +1,10 @@ package data import ( + "crypto/md5" "fmt" + "github.com/oylshe1314/framework/server" + "github.com/oylshe1314/framework/util" "os" "reflect" "strings" @@ -12,6 +15,8 @@ type tableLoader interface { } type Tables struct { + dataDir string + Copy CopyTable CopyMain CopyMainTable Equip EquipTable @@ -35,14 +40,28 @@ type Tables struct { UpgradeMaster UpgradeMasterTable } -func NewTables(dataDir string) (*Tables, error) { - var tables = new(Tables) - var tt = reflect.TypeOf(tables).Elem() - var tv = reflect.ValueOf(tables).Elem() +func NewTables(dataDir string) *Tables { + return &Tables{dataDir: dataDir} +} + +func (this *Tables) Load() error { + allHash, _, err := util.HashAll(md5.New(), true, nil, []string{this.dataDir}, nil) + if err != nil { + return err + } + + server.DataHash = allHash[0] + + var tt = reflect.TypeOf(this).Elem() + var tv = reflect.ValueOf(this).Elem() var fn = tt.NumField() for i := range fn { var sf = tt.Field(i) + if !sf.IsExported() { + continue + } + var ft = sf.Type var name = ft.Name() if strings.HasSuffix(name, "Table") { @@ -56,16 +75,16 @@ func NewTables(dataDir string) (*Tables, error) { continue } - buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", dataDir, strings.ToLower(name))) + buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", this.dataDir, strings.ToLower(name))) if err != nil { - return nil, err + return err } err = loader.load(buf) if err != nil { - return nil, err + return err } } - return tables, nil + return nil } diff --git a/servers/game/logic/manager_player.go b/servers/game/logic/manager_player.go index b232f0c..189864b 100644 --- a/servers/game/logic/manager_player.go +++ b/servers/game/logic/manager_player.go @@ -174,6 +174,21 @@ func (this *PlayerManager) storeChanges(player *Player) { } } +func (this *PlayerManager) tick(player *Player, now, elapsed int64) int64 { + player.lock() // lock + defer player.unlock() + + this.clearChanges(player) + + var b = util.UnixMilli() + player.tick(now, elapsed) + var e = util.UnixMilli() + + this.storeChanges(player) + + return e - b +} + func (this *PlayerManager) run(player *Player) { go func(player *Player) { this.waitGroup.Add(1) @@ -183,32 +198,22 @@ func (this *PlayerManager) run(player *Player) { this.waitGroup.Done() }() - var b, e int64 - var elapsed int64 = 0 + var spend int64 + var elapsed int64 for { now := <-ticker.C elapsed++ - player.lock() // lock - this.clearChanges(player) - - b = util.UnixMilli() - player.tick(now.Unix(), elapsed) - e = util.UnixMilli() - - this.storeChanges(player) - + spend = this.tick(player, now.Unix(), elapsed) if this.closed || player.exited { - player.unlock() // unlock return } - player.unlock() // unlock - if e-b >= 1000 { - this.logger.Warnf("[%s:%d] The executing time of the player loop function is too long, Time: %dms, userId: %d, roleId: %d", + if spend >= 1000 { + this.logger.Warnf("[%s:%d] The time spent executing the player loop function was too long, Time: %dms, userId: %d, roleId: %d", player.Temp.Address, player.RoleId, - e-b, + spend, player.UserId, player.RoleId) } @@ -416,10 +421,11 @@ func (this *PlayerManager) Enter(player *Player, conn *net.Conn) { this.PutPlayer(player) player.lock() + defer player.unlock() + this.clearChanges(player) player.enter(conn) this.storeChanges(player) - player.unlock() this.run(player) @@ -430,8 +436,9 @@ func (this *PlayerManager) Reenter(player *Player, conn *net.Conn) { this.logger.Infof("[%s] The player reenter game, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) player.lock() + defer player.unlock() + player.reenter(conn) - player.unlock() this.serverManager.AddOnline(1) } @@ -442,8 +449,9 @@ func (this *PlayerManager) Exit(player *Player) { this.RemovePlayer(player.UserId) player.lock() + defer player.unlock() + player.exit() - player.lock() this.serverManager.ReduceOnline(1) } @@ -452,10 +460,20 @@ func (this *PlayerManager) Lost(player *Player) { this.logger.Infof("[%s] The player lost, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) player.lock() + defer player.unlock() + player.lost(func() { this.RemovePlayer(player.UserId) }) - player.unlock() + + this.serverManager.ReduceOnline(1) +} + +func (this *PlayerManager) kick(player *Player, message string) { + player.lock() + defer player.unlock() + + player.kick(message) this.serverManager.ReduceOnline(1) } @@ -465,11 +483,7 @@ func (this *PlayerManager) Kick(player *Player, message string) { this.RemovePlayer(player.UserId) - player.lock() - player.kick(message) - player.unlock() - - this.serverManager.ReduceOnline(1) + this.kick(player, message) } func (this *PlayerManager) KickAll(message string) { @@ -479,11 +493,7 @@ func (this *PlayerManager) KickAll(message string) { defer this.locker.Unlock() for _, player := range this.players { - player.lock() - player.kick(message) - player.unlock() - - this.serverManager.ReduceOnline(1) + this.kick(player, message) } this.players = map[uint64]*Player{} } diff --git a/servers/game/logic/player.go b/servers/game/logic/player.go index b653af7..a347524 100644 --- a/servers/game/logic/player.go +++ b/servers/game/logic/player.go @@ -98,8 +98,8 @@ type Player struct { Temp PlayerTemp `bson:"-" json:"-"` //Non-data - conn *net.Conn - mutex sync.Mutex + conn *net.Conn + locker sync.Mutex exited bool @@ -129,11 +129,11 @@ func (this *Player) TipNotice(err proto.TipError) error { } func (this *Player) lock() { - this.mutex.Lock() + this.locker.Lock() } func (this *Player) unlock() { - this.mutex.Unlock() + this.locker.Unlock() } func (this *Player) sync() { diff --git a/servers/game/server.go b/servers/game/server.go index ab117f4..1cd8921 100644 --- a/servers/game/server.go +++ b/servers/game/server.go @@ -282,7 +282,8 @@ func (this *gameServer) Close() error { } func (this *gameServer) Load(dir string) error { - var dataTables, err = data.NewTables(dir) + var dataTables = data.NewTables(dir) + var err = dataTables.Load() if err != nil { return err }