1 Star 0 Fork 0

liuxuezhan / mylib

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
init.go 10.87 KB
一键复制 编辑 原始数据 按行查看 历史
liuxuezhan 提交于 2020-10-14 10:09 . 'new mylib'
package observer
import (
"runtime"
"gitee.com/liuxuezhan/mylib/Utils/wlog"
"github.com/sasha-s/go-deadlock"
)
const (
//事件id
AchievementEvent = 10001
AirShipActionEvent = 15001
HeroUpgradeEvent = 15002
CityLandUnlockEvent = 15003
LordTalentEvent = 15004
LeagueHelpEvent = 15005
LeagueDonateEvent = 15006
LeagueBoxEvent = 15007
UserTrainUnitEvent = 15008 //训练士兵
UserTaskFinishEvent = 15009 //完成任务
UserActivityFinish = 15010 //完成活动
LeagueCoinCostEvent = 15014 //消费联盟币 //这个是什么玩意儿?
MinitrayRankUpEvent = 15015 //军衔提升
LordExpGainEvent = 15016 //领主经验
HeroExpGainEvent = 15017 //英雄经验
HeroGemCostEvent = 15018 //消耗宝石
UserStatueEvent = 15019 //雕像事件 0:拆 1:建 2:增幅
HeroRecruitEvent = 15020 //英雄招募
HeroStarEvent = 15021 //英雄升星
HeroRankEvent = 15022 //英雄升级
HeroSkillEvent = 15023 //英雄技能升级
CommanderChangeName = 15024 //指挥官改名
PushMapGetReward = 15025 //推图奖励
UserPowerUpdateEvent = 20001 //(只有战力提升才会触发事件)
MainCityLevelUpgradeEvent = 20002
CommanderLevelUpgradeEvent = 20003
CommanderKilledUpgradeEvent = 20004
DeleteLeagueEvent = 20005
UserCreateLeagueEvent = 20006
UserJoinLeagueEvent = 20007
UserLoginEvent = 20008
UserLogoutEvent = 20009
ExitLeagueEvent = 20010
LeaguePermissionUp = 20011
LeaguePermissionDown = 20012
OccupyLeagueCity = 20013
OpenLeagueGift = 20014
LeagueSetSlogan = 20015
CostCashEvent = 20016 // 挑战活动花费资源事件
CostItemEvent = 20017 // 挑战活动花费道具事件
ReceiveUnitEvent = 20018 // 挑战活动收取士兵事件
DispatchTaskEvent = 20019 // 挑战活动完成派遣任务
OnlineGiftPacketEvent = 20020 // 挑战活动领取在线礼包
ChallengeKillMonsterEvent = 20022 // 挑战活动杀野怪
BlackMarketEvent = 20023 // 挑战活动黑市兑换次数
SupplyEvent = 20024 // 挑战活动后勤补给次数
ProductStatueEvent = 20025 // 挑战活动生产雕像
KYEvent = 20026 //科研
ProductEquipEvent = 20027 // 锻造装备
TakeCardEvent = 20028 // 抽卡事件
SpeedTimeEvent = 20029 // 加速时长
HeroCountEvent = 20030 // 英雄数量
ActivityTaskEvent = 20031 // 活动度任务完成次数事件
UpgradeUnitEvent = 20032 // 兵种升级事件
CommanderAirShipUpgradeEvent = 20033
WorldSituationRankEvent = 20034
HeroKilledUpgradeEvent = 20035 //英雄击杀士兵数量
KillMachineCenterEvent = 20036 //击杀机械中枢
UpdateUserPower = 20037 // 更新玩家战力
UpdateLeaguePowerRank = 20038 //更新联盟战力排行榜
CallBlackMarketStart = 25001 // 让黑市开启
CallBlackMarketStop = 25002 // 让黑市关闭
SpeedItemUseEvent = 25003 // 使用加速道具
ResearchStartEvent = 25004 // 开始研究科技
ResearchFinishEvent = 25005 // 完成研究科技
GameDBReload = 30001
ProductUnitEvent = 40001 // 活动生产士兵事件
UserCollectEvent = 40002 // 活动采集事件
BuildingUpgradeEvent = 40003 // 活动建筑升级事件
ResearchEvent = 40004 // 活动研发升级事件
KillMonsterEvent = 40005 // 活动杀野怪事件
MASSMutiMonsterEvent = 40006 // 集结一次多人怪事件
PVPKillEvevt = 40007 // PVP杀敌事件
WarCityEvevt = 40008 // 城市争霸事件个人
WarCityEvevt2 = 40008 // 城市争霸事件全服
ActivityActionEndEvent = 45001 // 活动行为结束事件
ActivityLeagueCheckEvent = 45002 // 活动积分更新事件
ActivityStageUpdateEvent = 45003 // 活动阶段更新事件
LeagueCupTaskUpdateEvent = 45004 // 联盟杯,交任务事件
GetLeagueGiftEvent = 45005 // 领取联盟礼物
MacPlayerScoreEvent = 45006 // 怪物攻城个人积分事件
MacLeagueScoreEvent = 45007 // 怪物攻城联盟积分事件
PVPBeKilledEvent = 45008 // PVP被杀事件
ActivityTaskReceiveUnitEvent = 50001 // 活跃度系统生产兵种,生产陷阱,治疗伤兵事件
ActivityTaskLeagueHelpEvent = 50003 // 活跃度系统联盟帮助事件
ActivityTaskLeagueTechEvent = 50004 // 活跃度系统联盟科技事件
ActivityTaskResearchEvent = 50005 // 活跃度系统研发科技事件
ActivityTaskBuildingUpgradeEvent = 50006 // 活跃度系统建筑升级事件
ActivityTaskKillMonsterEvent = 50007 // 活跃度系统杀野怪事件
ActivityTaskCollectEvent = 50008 // 活跃度系统采集资源事件
ActivityTaskBlackMarketEvent = 50009 // 活跃度系统黑市兑换事件
ActivityTaskSupplyEvent = 50010 // 活跃度系统后勤补给事件
ActivityTaskMapListEvent = 50011 // 活跃度系统副本事件
ActivityTaskDispatchTaskEvent = 50012 // 活跃度系统派遣任务事件
ActivityTaskHeroEvent = 50013 // 活跃度系统英雄培养事件
KillMonsterExEvent = 50014 // 击杀单人小野怪
ResourceSpeedEvent = 50015 // 资源产量
LeagueTaskEvent = 50016 // 联盟任务次数
ActivityTaskLeagueTaskEvent = 50017 // 活跃度系统联盟任务事件
BigMiracleEvent = 50019 // 大奇迹
UseItemEvent = 50020 // 使用道具
Event_50021 = 50021 // 收集资源
AttackMonsterEvent = 55001 // 攻打野怪事件 {userData, count, monLv}
NoticeTask = 55002 // 新七日活动 {userData, count, monLv}
LeagueCityRecordEvent = 60001 //联盟城市获得积分记录
AddMiracleWarRecordEvent = 70001 // 添加王战记录事件
SetBountyEvent = 80001 // 设置赏金
DeletePrisonEvent = 80002 // 释放指挥官
InsertPrisonEvent = 80003 // 抓捕指挥官
BlackMarketOpenEvent = 80004 // 黑市开启
ActivityLoginType_10_Event = 80005 // 逻辑类型10活动上分
ActivityLoginType_11_Event = 80006 // 逻辑类型11活动上分
ItemUnitEvent = 80007 // 道具获得士兵
Cash100Event = 80008 // 钻石消费
XJEvent = 80009 // 陷阱事件
HeroPowerEvent = 80010 // 英雄战力事件
PurchaseItemsEvent = 99999 //玩家付费购买
)
var (
ObserverSingleton *ObserverObject
//最大派发协程数量
MaxDispatcherNumber = runtime.NumCPU()
)
/**
@brief 观察者参数
*/
type ObserverHandlerParam struct {
theLock deadlock.RWMutex
theMap map[uint32][]func([]interface{})
}
/**
@brief 实例化
*/
func NewObserverHandlerParam() *ObserverHandlerParam {
object := &ObserverHandlerParam{}
object.theMap = make(map[uint32][]func([]interface{}))
return object
}
/**
@brief 注册消息处理器
*/
func RegisterWithParam(object *ObserverHandlerParam, id uint32, callback func([]interface{})) {
object.theLock.Lock()
defer object.theLock.Unlock()
if v, ok := object.theMap[id]; !ok {
object.theMap[id] = []func([]interface{}){callback}
} else {
object.theMap[id] = append(v, callback)
}
}
/**
@brief 删除消息处理器
*/
func UnRegisterWithParam(object *ObserverHandlerParam, id uint32) {
object.theLock.Lock()
defer object.theLock.Unlock()
delete(object.theMap, id)
}
/**
@brief 同步通知
*/
func SyncNotifyWithParam(object *ObserverHandlerParam, id uint32, param []interface{}) {
object.theLock.RLock()
if v, ok := object.theMap[id]; ok {
for _, callback := range v {
callback(param)
}
}
object.theLock.RUnlock()
}
/**
@brief 通知参数
*/
type NotifyParam struct {
EventID uint32
Args []interface{}
}
/**
@brief 观察者对象
*/
type ObserverObject struct {
theLock deadlock.RWMutex
breakChannel chan bool
exitChannel chan bool
eventChannel []chan *NotifyParam
theMap map[uint32][]func([]interface{})
}
/**
@brief 通知实现
*/
func (object *ObserverObject) notify() {
notifyImpl := func(b, e chan bool, c chan *NotifyParam) {
loop:
for {
select {
case <-b:
break loop
case arg := <-c:
if nil == arg {
continue
}
object.theLock.RLock()
if v, ok := object.theMap[arg.EventID]; ok {
for _, callback := range v {
callback(arg.Args)
}
}
object.theLock.RUnlock()
}
}
e <- true
}
//创建携程组
bArr := make([]chan bool, 0)
eArr := make([]chan bool, 0)
for i := 0; i < MaxDispatcherNumber; i++ {
bArr = append(bArr, make(chan bool, 1))
eArr = append(bArr, make(chan bool, 1))
go notifyImpl(bArr[i], eArr[i], object.eventChannel[i])
}
//等待观察者退出
<-object.breakChannel
for i := 0; i < MaxDispatcherNumber; i++ {
bArr[i] <- true
<-eArr[i]
}
object.exitChannel <- true
}
/**
@brief 初始化
*/
func (object *ObserverObject) init() {
object.breakChannel = make(chan bool, 1)
object.exitChannel = make(chan bool, 1)
object.eventChannel = make([]chan *NotifyParam, 0)
for i := 0; i < MaxDispatcherNumber; i++ {
object.eventChannel = append(object.eventChannel, make(chan *NotifyParam, 10000))
}
object.theMap = make(map[uint32][]func([]interface{}))
go object.notify()
}
/**
@brief 退出
*/
func (object *ObserverObject) Exit() {
object.breakChannel <- true
close(object.breakChannel)
//close(object.eventChannel)
<-object.exitChannel
close(object.exitChannel)
wlog.Info("observer exited...")
}
/**
@brief 注册消息处理器
*/
func (object *ObserverObject) Register(id uint32, callback func([]interface{})) {
object.theLock.Lock()
defer object.theLock.Unlock()
if v, ok := object.theMap[id]; !ok {
object.theMap[id] = []func([]interface{}){callback}
} else {
object.theMap[id] = append(v, callback)
}
}
/**
@brief 删除消息处理器
*/
func (object *ObserverObject) UnRegister(id uint32) {
object.theLock.Lock()
defer object.theLock.Unlock()
delete(object.theMap, id)
}
/**
@brief 同步通知
*/
func (object *ObserverObject) SyncNotify(id uint32, param []interface{}) {
object.theLock.RLock()
if v, ok := object.theMap[id]; ok {
for _, callback := range v {
callback(param)
}
}
object.theLock.RUnlock()
}
/**
@brief 异步通知
*/
func (object *ObserverObject) AsyncNotify(id uint32, param []interface{}) {
if nil == object.eventChannel {
return
}
min := len(object.eventChannel[0])
minIdx := 0
for i := 1; i < MaxDispatcherNumber; i++ {
if len(object.eventChannel[i]) < min {
min = len(object.eventChannel[i])
minIdx = i
}
}
if len(object.eventChannel[minIdx]) >= cap(object.eventChannel[minIdx]) {
wlog.Error("Observer event pool full")
return
}
object.eventChannel[minIdx] <- &NotifyParam{EventID: id, Args: param}
}
/**
@brief 初始化
*/
func init() {
ObserverSingleton = &ObserverObject{}
ObserverSingleton.init()
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liuxuezhan/mylib.git
git@gitee.com:liuxuezhan/mylib.git
liuxuezhan
mylib
mylib
v1.1.1

搜索帮助

344bd9b3 5694891 D2dac590 5694891