修正严重BUG
This commit is contained in:
parent
42912cdae6
commit
570f9a57fd
@ -1,7 +1,10 @@
|
|||||||
package data
|
package data
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/md5"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/oylshe1314/framework/server"
|
||||||
|
"github.com/oylshe1314/framework/util"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
@ -12,6 +15,8 @@ type tableLoader interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Tables struct {
|
type Tables struct {
|
||||||
|
dataDir string
|
||||||
|
|
||||||
Copy CopyTable
|
Copy CopyTable
|
||||||
CopyMain CopyMainTable
|
CopyMain CopyMainTable
|
||||||
Equip EquipTable
|
Equip EquipTable
|
||||||
@ -35,14 +40,28 @@ type Tables struct {
|
|||||||
UpgradeMaster UpgradeMasterTable
|
UpgradeMaster UpgradeMasterTable
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTables(dataDir string) (*Tables, error) {
|
func NewTables(dataDir string) *Tables {
|
||||||
var tables = new(Tables)
|
return &Tables{dataDir: dataDir}
|
||||||
var tt = reflect.TypeOf(tables).Elem()
|
}
|
||||||
var tv = reflect.ValueOf(tables).Elem()
|
|
||||||
|
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()
|
var fn = tt.NumField()
|
||||||
for i := range fn {
|
for i := range fn {
|
||||||
var sf = tt.Field(i)
|
var sf = tt.Field(i)
|
||||||
|
if !sf.IsExported() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
var ft = sf.Type
|
var ft = sf.Type
|
||||||
var name = ft.Name()
|
var name = ft.Name()
|
||||||
if strings.HasSuffix(name, "Table") {
|
if strings.HasSuffix(name, "Table") {
|
||||||
@ -56,16 +75,16 @@ func NewTables(dataDir string) (*Tables, error) {
|
|||||||
continue
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = loader.load(buf)
|
err = loader.load(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return tables, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
func (this *PlayerManager) run(player *Player) {
|
||||||
go func(player *Player) {
|
go func(player *Player) {
|
||||||
this.waitGroup.Add(1)
|
this.waitGroup.Add(1)
|
||||||
@ -183,32 +198,22 @@ func (this *PlayerManager) run(player *Player) {
|
|||||||
this.waitGroup.Done()
|
this.waitGroup.Done()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var b, e int64
|
var spend int64
|
||||||
var elapsed int64 = 0
|
var elapsed int64
|
||||||
for {
|
for {
|
||||||
now := <-ticker.C
|
now := <-ticker.C
|
||||||
elapsed++
|
elapsed++
|
||||||
|
|
||||||
player.lock() // lock
|
spend = this.tick(player, now.Unix(), elapsed)
|
||||||
this.clearChanges(player)
|
|
||||||
|
|
||||||
b = util.UnixMilli()
|
|
||||||
player.tick(now.Unix(), elapsed)
|
|
||||||
e = util.UnixMilli()
|
|
||||||
|
|
||||||
this.storeChanges(player)
|
|
||||||
|
|
||||||
if this.closed || player.exited {
|
if this.closed || player.exited {
|
||||||
player.unlock() // unlock
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
player.unlock() // unlock
|
if spend >= 1000 {
|
||||||
if e-b >= 1000 {
|
this.logger.Warnf("[%s:%d] The time spent executing the player loop function was too long, Time: %dms, userId: %d, roleId: %d",
|
||||||
this.logger.Warnf("[%s:%d] The executing time of the player loop function is too long, Time: %dms, userId: %d, roleId: %d",
|
|
||||||
player.Temp.Address,
|
player.Temp.Address,
|
||||||
player.RoleId,
|
player.RoleId,
|
||||||
e-b,
|
spend,
|
||||||
player.UserId,
|
player.UserId,
|
||||||
player.RoleId)
|
player.RoleId)
|
||||||
}
|
}
|
||||||
@ -416,10 +421,11 @@ func (this *PlayerManager) Enter(player *Player, conn *net.Conn) {
|
|||||||
this.PutPlayer(player)
|
this.PutPlayer(player)
|
||||||
|
|
||||||
player.lock()
|
player.lock()
|
||||||
|
defer player.unlock()
|
||||||
|
|
||||||
this.clearChanges(player)
|
this.clearChanges(player)
|
||||||
player.enter(conn)
|
player.enter(conn)
|
||||||
this.storeChanges(player)
|
this.storeChanges(player)
|
||||||
player.unlock()
|
|
||||||
|
|
||||||
this.run(player)
|
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)
|
this.logger.Infof("[%s] The player reenter game, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId)
|
||||||
|
|
||||||
player.lock()
|
player.lock()
|
||||||
|
defer player.unlock()
|
||||||
|
|
||||||
player.reenter(conn)
|
player.reenter(conn)
|
||||||
player.unlock()
|
|
||||||
|
|
||||||
this.serverManager.AddOnline(1)
|
this.serverManager.AddOnline(1)
|
||||||
}
|
}
|
||||||
@ -442,8 +449,9 @@ func (this *PlayerManager) Exit(player *Player) {
|
|||||||
this.RemovePlayer(player.UserId)
|
this.RemovePlayer(player.UserId)
|
||||||
|
|
||||||
player.lock()
|
player.lock()
|
||||||
|
defer player.unlock()
|
||||||
|
|
||||||
player.exit()
|
player.exit()
|
||||||
player.lock()
|
|
||||||
|
|
||||||
this.serverManager.ReduceOnline(1)
|
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)
|
this.logger.Infof("[%s] The player lost, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId)
|
||||||
|
|
||||||
player.lock()
|
player.lock()
|
||||||
|
defer player.unlock()
|
||||||
|
|
||||||
player.lost(func() {
|
player.lost(func() {
|
||||||
this.RemovePlayer(player.UserId)
|
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)
|
this.serverManager.ReduceOnline(1)
|
||||||
}
|
}
|
||||||
@ -465,11 +483,7 @@ func (this *PlayerManager) Kick(player *Player, message string) {
|
|||||||
|
|
||||||
this.RemovePlayer(player.UserId)
|
this.RemovePlayer(player.UserId)
|
||||||
|
|
||||||
player.lock()
|
this.kick(player, message)
|
||||||
player.kick(message)
|
|
||||||
player.unlock()
|
|
||||||
|
|
||||||
this.serverManager.ReduceOnline(1)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *PlayerManager) KickAll(message string) {
|
func (this *PlayerManager) KickAll(message string) {
|
||||||
@ -479,11 +493,7 @@ func (this *PlayerManager) KickAll(message string) {
|
|||||||
defer this.locker.Unlock()
|
defer this.locker.Unlock()
|
||||||
|
|
||||||
for _, player := range this.players {
|
for _, player := range this.players {
|
||||||
player.lock()
|
this.kick(player, message)
|
||||||
player.kick(message)
|
|
||||||
player.unlock()
|
|
||||||
|
|
||||||
this.serverManager.ReduceOnline(1)
|
|
||||||
}
|
}
|
||||||
this.players = map[uint64]*Player{}
|
this.players = map[uint64]*Player{}
|
||||||
}
|
}
|
||||||
|
@ -98,8 +98,8 @@ type Player struct {
|
|||||||
Temp PlayerTemp `bson:"-" json:"-"`
|
Temp PlayerTemp `bson:"-" json:"-"`
|
||||||
|
|
||||||
//Non-data
|
//Non-data
|
||||||
conn *net.Conn
|
conn *net.Conn
|
||||||
mutex sync.Mutex
|
locker sync.Mutex
|
||||||
|
|
||||||
exited bool
|
exited bool
|
||||||
|
|
||||||
@ -129,11 +129,11 @@ func (this *Player) TipNotice(err proto.TipError) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *Player) lock() {
|
func (this *Player) lock() {
|
||||||
this.mutex.Lock()
|
this.locker.Lock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Player) unlock() {
|
func (this *Player) unlock() {
|
||||||
this.mutex.Unlock()
|
this.locker.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Player) sync() {
|
func (this *Player) sync() {
|
||||||
|
@ -282,7 +282,8 @@ func (this *gameServer) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *gameServer) Load(dir string) 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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user