112 lines
2.6 KiB
Go
112 lines
2.6 KiB
Go
package main
|
||
|
||
import (
|
||
"slices"
|
||
"time"
|
||
|
||
"mongo.games.com/goserver/core/logger"
|
||
|
||
"mongo.games.com/game/common"
|
||
"mongo.games.com/game/protocol/gamehall"
|
||
)
|
||
|
||
func init() {
|
||
common.ClockMgrSingleton.RegisterSinker(PlayerNotifySingle)
|
||
}
|
||
|
||
var PlayerNotifySingle = &PlayerNotify{
|
||
players: make(map[int32]map[int32]*PlayerNotifyInfo),
|
||
}
|
||
|
||
type PlayerNotifyInfo struct {
|
||
SnId int32 // 玩家id
|
||
Ts int64 // 失效时间戳
|
||
}
|
||
|
||
type PlayerNotify struct {
|
||
common.BaseClockSinker
|
||
players map[int32]map[int32]*PlayerNotifyInfo // 消息类型:玩家id:玩家信息
|
||
}
|
||
|
||
func (p *PlayerNotify) InterestClockEvent() int {
|
||
return 1 << common.ClockEventMinute
|
||
}
|
||
|
||
func (p *PlayerNotify) OnMiniTimer() {
|
||
now := time.Now()
|
||
for _, v := range p.players {
|
||
var ids []int32
|
||
for k, vv := range v {
|
||
if vv == nil || vv.Ts <= now.Unix() {
|
||
ids = append(ids, k)
|
||
}
|
||
}
|
||
for _, id := range ids {
|
||
delete(v, id)
|
||
}
|
||
}
|
||
}
|
||
|
||
// AddTime 延长某个类型消息的通知时间
|
||
// snid 玩家id
|
||
// tp 消息类型
|
||
// d 延长时间
|
||
func (p *PlayerNotify) AddTime(snid int32, tp common.NotifyType, d time.Duration) {
|
||
if _, ok := p.players[int32(tp)]; !ok {
|
||
p.players[int32(tp)] = make(map[int32]*PlayerNotifyInfo)
|
||
}
|
||
p.players[int32(tp)][snid] = &PlayerNotifyInfo{
|
||
SnId: snid,
|
||
Ts: time.Now().Add(d).Unix(),
|
||
}
|
||
}
|
||
|
||
// GetPlayers 获取某个类型消息的玩家id
|
||
// tp 消息类型
|
||
func (p *PlayerNotify) GetPlayers(tp common.NotifyType) []int32 {
|
||
now := time.Now()
|
||
var ret []int32
|
||
for k, v := range p.players[int32(tp)] {
|
||
if v == nil || v.Ts <= now.Unix() {
|
||
continue
|
||
}
|
||
ret = append(ret, k)
|
||
}
|
||
return ret
|
||
}
|
||
|
||
// SendToClient 发送消息给客户端
|
||
// tp 消息类型
|
||
func (p *PlayerNotify) SendToClient(tp common.NotifyType, platform string, packetId int, pack interface{}) {
|
||
switch tp {
|
||
case common.NotifyPrivateRoomList:
|
||
d := pack.(*gamehall.SCGetPrivateRoomList)
|
||
if len(d.GetDatas()) == 0 {
|
||
return
|
||
}
|
||
//scene := SceneMgrSingleton.GetScene(int(d.GetDatas()[0].GetRoomId()), true)
|
||
//if scene == nil {
|
||
// return
|
||
//}
|
||
roomConfigId := d.GetDatas()[0].GetRoomConfigId()
|
||
cfg := PlatformMgrSingleton.GetConfig(platform).RoomConfig[roomConfigId]
|
||
if cfg == nil || cfg.GetOn() != common.On {
|
||
return
|
||
}
|
||
|
||
var ids []int32
|
||
for _, v := range p.GetPlayers(tp) {
|
||
player := PlayerMgrSington.GetPlayerBySnId(v)
|
||
if player == nil {
|
||
continue
|
||
}
|
||
if slices.Contains(cfg.GetOnChannelName(), player.LastChannel) {
|
||
ids = append(ids, v)
|
||
}
|
||
}
|
||
|
||
PlayerMgrSington.BroadcastMessageToTarget(ids, packetId, pack)
|
||
logger.Logger.Tracef("PlayerNotify SendToClient tp:%v ids:%v", tp, ids)
|
||
}
|
||
}
|