game_sync/worldsrv/horseracelamp.go

396 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"github.com/globalsign/mgo/bson"
"math"
"mongo.games.com/game/model"
"mongo.games.com/game/proto"
"mongo.games.com/game/protocol/message"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/module"
"strings"
"time"
)
// 0] "<font color='#FFF200' size='24'>%s</font>"
// 5] "玩家 %s 在 %s 中获得了 %s元 ,进入游戏即可参与!"
// 6] "玩家 在 %s 中获得了爆池奖励 %s元 ,进入游戏即可参与!"
// 10] "恭喜 %s 在 %s 游戏内获得jackpot %s ,中奖金额【 %s】"
// 11] "恭喜 %s 击杀 %s %s 获得 %s奖励"
const (
//消息类型 0:标示消息内容为服务端拼装好的字符串
//1-99:根据客户端配置的编号格式化参数组成完整的消息内容(详见:HorseRaceLampMsgType)
//100:弹幕跑马灯
HorseRaceLampType_ServerStr = 0
HorseRaceLampType_CoinNormal = 5
HorseRaceLampType_CoinReward = 6
HorseRaceLampType_CustomMsg = 100
)
var HorseRaceLampMgrSington = &HorseRaceLampMgr{
HorseRaceLampMsgList: make(map[string]*HorseRaceLamp),
HorseRaceLampGameList: make(map[string][]*HorseRaceLamp),
HorseRaceLampCastList: make(map[string]*HorseRaceLampCastInfo),
NextGameHorseRaceLamp: make(map[string]int64),
}
type HorseRaceLampMgr struct {
HorseRaceLampMsgList map[string]*HorseRaceLamp // _id跑马灯数据; 所有平台数据
HorseRaceLampGameList map[string][]*HorseRaceLamp // 平台:跑马灯
HorseRaceLampCastList map[string]*HorseRaceLampCastInfo // 平台:跑马灯
NextGameHorseRaceLamp map[string]int64
}
type HorseRaceLamp struct {
Key string
Channel string
Title string
Content string
Footer string
StartTime int64
Interval int32
limitInterval int32
Count int32 // bo
LastTime int64
Priority int32
CreateTime int64
MsgType int32
Platform string
State int32
isRob bool
Target []int32
StandSec int32
}
type HorseRaceLampCastInfo struct {
CurIndex int
CurTime int64
DealQueue []*HorseRaceLamp
DealList []*HorseRaceLamp // 弹幕跑马灯列表
}
func (this *HorseRaceLampMgr) InitHorseRaceLamp() {
for _, p := range PlatformMgrSingleton.GetPlatforms() {
noticeList, err := model.GetAllHorseRaceLamp(p.IdStr)
if err != nil {
logger.Logger.Error("InitHorseRaceLamp count failed:", err, noticeList)
}
for _, value := range noticeList {
msg := &HorseRaceLamp{
Key: value.Id.Hex(),
Channel: value.Channel,
Content: value.Content,
StartTime: value.StartTime,
Interval: value.Interval,
Count: value.Count,
MsgType: value.MsgType,
Priority: value.Priority,
CreateTime: value.CreateTime,
Platform: value.Platform,
State: value.State,
Target: value.Target,
StandSec: value.StandSec,
limitInterval: int32(math.Floor(float64(len(value.Content))*0.3)) + 6,
}
this.HorseRaceLampMsgList[value.Id.Hex()] = msg
this.insertToCastMsg(msg)
}
}
}
func (this *HorseRaceLampMgr) AddHorseRaceLampMsg(key, ch, p, title, content, footer string, startTime int64, interval, count,
msgType, state, priority int32, createTime int64, target []int32, standSec int32) string {
msg := &HorseRaceLamp{
Key: key,
Channel: ch,
Title: title,
Content: content,
Footer: footer,
StartTime: startTime,
Interval: interval,
Count: count,
MsgType: msgType,
Priority: priority,
CreateTime: createTime,
Platform: p,
State: state,
Target: target,
StandSec: standSec,
}
this.HorseRaceLampMsgList[key] = msg
this.insertToCastMsg(msg)
return key
}
func (this *HorseRaceLampMgr) insertToCastMsg(msg *HorseRaceLamp) {
pKey := msg.Platform
if this.HorseRaceLampCastList[pKey] == nil {
this.HorseRaceLampCastList[pKey] = &HorseRaceLampCastInfo{
CurIndex: 0,
CurTime: 0,
DealQueue: []*HorseRaceLamp{},
DealList: []*HorseRaceLamp{},
}
} else {
switch msg.MsgType {
case HorseRaceLampType_CustomMsg:
this.HorseRaceLampCastList[pKey].DealList = append(this.HorseRaceLampCastList[pKey].DealList, msg)
default:
this.HorseRaceLampCastList[pKey].DealQueue = append(this.HorseRaceLampCastList[pKey].DealQueue, msg)
}
}
}
func (this *HorseRaceLampMgr) EditHorseRaceLampMsg(hrl *HorseRaceLamp) bool {
if _, ok := this.HorseRaceLampMsgList[hrl.Key]; !ok {
return false
}
hrl.limitInterval = int32(math.Floor(float64(len(hrl.Content))*0.3)) + 6
this.HorseRaceLampMsgList[hrl.Key] = hrl
if pInfo, ok := this.HorseRaceLampCastList[hrl.Platform]; ok && hrl.MsgType != HorseRaceLampType_CustomMsg {
pInfo.CurTime = 0
pInfo.CurIndex = 0
}
return true
}
func (this *HorseRaceLampMgr) DelHorseRaceLampMsg(key string) {
if needDel, ok := this.HorseRaceLampMsgList[key]; ok {
if pInfo, ok := this.HorseRaceLampCastList[needDel.Platform]; ok {
pInfo.CurTime = 0
pInfo.CurIndex = 0
for index := range pInfo.DealQueue {
if pInfo.DealQueue[index] == needDel {
pInfo.DealQueue = append(pInfo.DealQueue[:index], pInfo.DealQueue[index+1:]...)
break
}
}
for index := range pInfo.DealList {
if pInfo.DealList[index] == needDel {
pInfo.DealList = append(pInfo.DealList[:index], pInfo.DealList[index+1:]...)
break
}
}
}
}
delete(this.HorseRaceLampMsgList, key)
}
func (this *HorseRaceLampMgr) PushGameHorseRaceLamp(ch, platform, content string, msgType int32, isRob bool, priority int32) bool {
msg := &HorseRaceLamp{
Channel: ch,
Content: content,
Count: 1,
MsgType: msgType,
Platform: platform,
Priority: priority,
limitInterval: int32(math.Floor(float64(len(content))*0.3)) + 6,
isRob: isRob,
}
if pool, exist := this.HorseRaceLampGameList[platform]; exist {
if len(pool) >= model.GameParamData.BacklogGameHorseRaceLamp && len(pool) > 0 {
minRobPriority := priority
minPlayerPriority := priority
bestRobIdx := -1
bestPlayerIdx := -1
for k, v := range pool {
if !isRob {
if v.isRob { //优先替换机器人的跑马灯
if v.Priority <= minRobPriority {
bestRobIdx = k
minRobPriority = v.Priority
}
} else { //其次替换真实玩家的跑马灯
if v.Priority < minPlayerPriority {
bestPlayerIdx = k
minPlayerPriority = v.Priority
}
}
} else {
if v.isRob {
if v.Priority < minRobPriority {
bestRobIdx = k
minRobPriority = v.Priority
}
}
}
}
if bestRobIdx != -1 { //优先替换机器人的跑马灯
pool = append(pool[:bestRobIdx], pool[bestRobIdx+1:]...)
} else if bestPlayerIdx != -1 { //其次替换玩家的跑马灯
pool = append(pool[:bestPlayerIdx], pool[bestPlayerIdx+1:]...)
} else { //没找到要替换的,直接丢弃自己的
return false
}
}
if !isRob {
// 替换一个机器人的消息,没有机器人则追加
isFindRob := false
if len(pool) > 0 {
for k, v := range pool {
if v.isRob {
pool[k] = msg
isFindRob = true
break
}
}
}
if isFindRob {
this.HorseRaceLampGameList[platform] = pool
} else {
this.HorseRaceLampGameList[platform] = append(pool, msg)
}
} else {
// 是机器人直接追加
this.HorseRaceLampGameList[platform] = append(pool, msg)
}
} else {
this.HorseRaceLampGameList[platform] = []*HorseRaceLamp{msg}
}
return true
}
func (this *HorseRaceLampMgr) DealHorseRaceLamp(uTime int64, value *HorseRaceLamp) {
if value.Count > 0 { // 播放次数
this.BroadcastHorseRaceLampMsg(value)
value.Count = value.Count - 1
value.LastTime = uTime
value.StartTime = value.LastTime + int64(value.Interval)
if value.Count <= 0 {
this.DelHorseRaceLampMsg(value.Key)
model.RemoveHorseRaceLamp(value.Key, value.Platform)
}
} else {
this.BroadcastHorseRaceLampMsg(value)
value.LastTime = uTime
value.StartTime = value.LastTime + int64(value.Interval)
}
}
// //////////////////////////////////////////////////////////////////
// / Module Implement [HorseRaceLampMgr]
// //////////////////////////////////////////////////////////////////
func (this *HorseRaceLampMgr) ModuleName() string {
return "HorseRaceLampMgr"
}
func (this *HorseRaceLampMgr) Init() {
}
func (this *HorseRaceLampMgr) Update() {
uTime := time.Now().Unix()
//调整了跑马灯功能,需要排队发送
for _, v := range this.HorseRaceLampCastList {
if uTime > v.CurTime {
if v.CurIndex < len(v.DealQueue) {
value := v.DealQueue[v.CurIndex]
//需要跳过
if value.State != 0 {
v.CurIndex += 1
if v.CurIndex >= len(v.DealQueue) {
v.CurIndex = 0
}
} else if uTime > value.StartTime && value.State == 0 {
this.DealHorseRaceLamp(uTime, value)
v.CurIndex += 1
if v.CurIndex >= len(v.DealQueue) {
v.CurIndex = 0
}
v.CurTime = uTime + int64(value.limitInterval)
}
}
}
}
for _, nc := range this.HorseRaceLampCastList {
for _, value := range nc.DealList {
if uTime > value.StartTime && value.State == 0 {
this.DealHorseRaceLamp(uTime, value)
}
}
}
for name, pool := range this.HorseRaceLampGameList {
if len(pool) > 0 {
msg := pool[0]
nextTs := this.NextGameHorseRaceLamp[name]
if uTime >= nextTs {
this.HorseRaceLampGameList[name] = pool[1:]
if msg != nil {
this.BroadcastHorseRaceLampMsg(msg)
this.NextGameHorseRaceLamp[name] = uTime + int64(msg.limitInterval)
}
}
}
}
}
func (this *HorseRaceLampMgr) SaveHorseRaceLamp() {
for _, hrl := range this.HorseRaceLampMsgList {
model.EditHorseRaceLamp(&model.HorseRaceLamp{
Id: bson.ObjectIdHex(hrl.Key),
Channel: "",
Title: hrl.Title,
Content: hrl.Content,
Footer: hrl.Footer,
StartTime: hrl.StartTime,
Interval: hrl.Interval,
Count: hrl.Count,
CreateTime: hrl.CreateTime,
Priority: hrl.Priority,
MsgType: hrl.MsgType,
Platform: hrl.Platform,
State: hrl.State,
Target: hrl.Target,
StandSec: hrl.StandSec,
})
}
}
func (this *HorseRaceLampMgr) Shutdown() {
this.SaveHorseRaceLamp()
module.UnregisteModule(this)
}
func (this *HorseRaceLampMgr) BroadcastHorseRaceLampMsg(horseRaceLamp *HorseRaceLamp) {
if horseRaceLamp.MsgType == HorseRaceLampType_CustomMsg {
logger.Logger.Infof(">>>>>>>弹幕>>>>>>>>(this *HorseRaceLampMgr) BroadcastHorseRaceLampMsg content:%v msgType:%v "+
"target:%v standSec:%v", horseRaceLamp.Content, horseRaceLamp.MsgType, horseRaceLamp.Target, horseRaceLamp.StandSec)
}
var rawpack = &message.SCNotice{
Count: proto.Int(1),
MsgType: proto.Int32(horseRaceLamp.MsgType),
Ts: proto.Int64(time.Now().Unix()), //发送时间
ChannelId: proto.String(horseRaceLamp.Channel),
Platform: proto.String(horseRaceLamp.Platform),
StandSec: proto.Int32(horseRaceLamp.StandSec),
}
if horseRaceLamp.MsgType == 0 {
rawpack.Params = append(rawpack.Params, &message.NoticeParam{StrParam: proto.String(horseRaceLamp.Content)})
} else if horseRaceLamp.MsgType > 0 && horseRaceLamp.MsgType < 100 {
strArr := strings.Split(horseRaceLamp.Content, "|")
for _, value := range strArr {
rawpack.Params = append(rawpack.Params, &message.NoticeParam{StrParam: proto.String(value)})
}
} else if horseRaceLamp.MsgType == 100 {
rawpack.Params = append(rawpack.Params, &message.NoticeParam{StrParam: proto.String(horseRaceLamp.Title)})
rawpack.Params = append(rawpack.Params, &message.NoticeParam{StrParam: proto.String(horseRaceLamp.Content)})
rawpack.Params = append(rawpack.Params, &message.NoticeParam{StrParam: proto.String(horseRaceLamp.Footer)})
}
proto.SetDefaults(rawpack)
if len(horseRaceLamp.Target) == 0 {
PlayerMgrSington.BroadcastMessageToPlatform(horseRaceLamp.Platform, int(message.MSGPacketID_PACKET_SC_NOTICE), rawpack)
} else {
PlayerMgrSington.BroadcastMessageToTarget(horseRaceLamp.Target, int(message.MSGPacketID_PACKET_SC_NOTICE), rawpack)
}
}
func init() {
module.RegisteModule(HorseRaceLampMgrSington, time.Second*3, 0)
}