game_sync/worldsrv/niceid.go

114 lines
3.3 KiB
Go

package main
import (
"fmt"
"math/rand"
"mongo.games.com/game/proto"
player_proto "mongo.games.com/game/protocol/player"
server_proto "mongo.games.com/game/protocol/server"
"mongo.games.com/goserver/core"
"mongo.games.com/goserver/core/logger"
)
var niceIdMgr = &NiceIdManager{
SnIds: []int32{},
UsedIds: make(map[int32]int32),
}
type NiceIdManager struct {
SnIds []int32
UsedIds map[int32]int32
RobHeadUrlIdx int32
}
func (this *NiceIdManager) init() {
//this.SnIds = model.GetInvalidSnid()
//this.SnIds = make([]int32, 0, len(srvdata.PBDB_PlayerInfoMgr.Datas.Arr))
//for _, value := range srvdata.PBDB_PlayerInfoMgr.Datas.Arr {
// this.SnIds = append(this.SnIds, value.GetId())
//}
snidLen := len(this.SnIds)
logger.Logger.Info("NiceIdManager snid lens:", snidLen)
for i := 0; i < snidLen; i++ {
index := rand.Intn(snidLen)
this.SnIds[i], this.SnIds[index] = this.SnIds[index], this.SnIds[i]
}
for _, value := range niceIdMgr.SnIds {
this.UsedIds[value] = 0
}
}
func (this *NiceIdManager) PopNiceId(user int32) int32 {
if len(this.SnIds) <= 0 {
return 0
}
selId := this.SnIds[len(this.SnIds)-1]
this.SnIds = this.SnIds[:len(this.SnIds)-1]
this.UsedIds[selId] = user
logger.Logger.Infof("NiceIdManager pop niceid %v to %v", selId, user)
return selId
}
func (this *NiceIdManager) PushNiceId(snid int32) {
if _, ok := this.UsedIds[snid]; ok {
this.SnIds = append(this.SnIds, snid)
snidLen := len(this.SnIds)
index := rand.Intn(snidLen)
this.SnIds[snidLen-1], this.SnIds[index] = this.SnIds[index], this.SnIds[snidLen-1]
this.UsedIds[snid] = 0
logger.Logger.Infof("NiceIdManager push niceid %v to cache", snid)
}
}
func (this *NiceIdManager) NiceIdCheck(playerid int32) {
logger.Logger.Infof("%v be used in NiceIdManager.", playerid)
if userid, ok := this.UsedIds[playerid]; ok {
delete(this.UsedIds, playerid)
if userid != 0 {
user := PlayerMgrSington.GetPlayerBySnId(userid)
if user != nil {
user.NiceId = this.PopNiceId(userid)
if user.scene != nil {
pack := &server_proto.WGNiceIdRebind{
User: proto.Int32(userid),
NewId: proto.Int32(user.NiceId),
}
user.SendToGame(int(server_proto.SSPacketID_PACKET_GW_NICEIDREBIND), pack)
packNr := &player_proto.SCNiceIdRebind{
SnidId: proto.Int32(userid),
NiceId: proto.Int32(user.NiceId),
}
user.scene.Broadcast(int(player_proto.PlayerPacketID_PACKET_SC_NICEIDREBIND), packNr, 0)
}
}
} else {
niceIndex := -1
for key, value := range this.SnIds {
if value == playerid {
niceIndex = key
break
}
}
if niceIndex != -1 {
curCount := len(this.SnIds)
this.SnIds[niceIndex], this.SnIds[curCount-1] = this.SnIds[curCount-1], this.SnIds[niceIndex]
this.SnIds = this.SnIds[:curCount-1]
}
}
}
}
func (this *NiceIdManager) GetRobHeadUrlIdx() string {
this.RobHeadUrlIdx++
if this.RobHeadUrlIdx > 1448 {
this.RobHeadUrlIdx = 1
}
return fmt.Sprintf("https://avatar-icon.oss-cn-guangzhou.aliyuncs.com/user_head/head_%v.jpg", this.RobHeadUrlIdx)
}
func (this *NiceIdManager) GetRobHeadUrl(idx int32) string {
return fmt.Sprintf("https://avatar-icon.oss-cn-guangzhou.aliyuncs.com/user_head/head_%v.jpg", idx)
}
func init() {
core.RegisteHook(core.HOOK_BEFORE_START, func() error {
niceIdMgr.init()
return nil
})
}