add: midi audio player

This commit is contained in:
flswld
2023-01-05 17:21:54 +08:00
parent 27f16d9063
commit ff650d9af7
7 changed files with 250 additions and 123 deletions
+133 -120
View File
@@ -13,6 +13,11 @@ import (
// 游戏服务器定时帧管理器
const (
ServerTickTime = 20 // 服务器全局tick最小间隔毫秒
UserTickTime = 1000 // 玩家自身tick最小间隔毫秒
)
type UserTimer struct {
timer *time.Timer
action int
@@ -33,7 +38,7 @@ type TickManager struct {
func NewTickManager() (r *TickManager) {
r = new(TickManager)
r.globalTick = time.NewTicker(time.Millisecond * 100)
r.globalTick = time.NewTicker(time.Millisecond * ServerTickTime)
r.globalTickCount = 0
r.userTickMap = make(map[uint32]*UserTick)
logger.Info("game server tick start at: %v", time.Now().UnixMilli())
@@ -45,7 +50,7 @@ func NewTickManager() (r *TickManager) {
// CreateUserGlobalTick 创建玩家tick对象
func (t *TickManager) CreateUserGlobalTick(userId uint32) {
t.userTickMap[userId] = &UserTick{
globalTick: time.NewTicker(time.Second * 1),
globalTick: time.NewTicker(time.Millisecond * UserTickTime),
globalTickCount: 0,
timerIdCounter: 0,
timerMap: make(map[uint64]*UserTimer),
@@ -74,11 +79,9 @@ func (t *TickManager) CreateUserTimer(userId uint32, action int, delay uint32) {
}
func (t *TickManager) onUserTickSecond(userId uint32, now int64) {
// logger.Info("on user tick second, uid: %v, time: %v", userId, now)
}
func (t *TickManager) onUserTickMinute(userId uint32, now int64) {
logger.Info("on user tick minute, uid: %v, time: %v", userId, now)
// 每分钟保存玩家数据
saveUserIdList := []uint32{userId}
LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{
@@ -105,32 +108,34 @@ func (t *TickManager) userTimerHandle(userId uint32, action int) {
func (t *TickManager) OnGameServerTick() {
t.globalTickCount++
now := time.Now().UnixMilli()
t.onTick100MilliSecond(now)
if t.globalTickCount%2 == 0 {
if t.globalTickCount%(50/ServerTickTime) == 0 {
t.onTick50MilliSecond(now)
}
if t.globalTickCount%(100/ServerTickTime) == 0 {
t.onTick100MilliSecond(now)
}
if t.globalTickCount%(200/ServerTickTime) == 0 {
t.onTick200MilliSecond(now)
}
if t.globalTickCount%(10*1) == 0 {
if t.globalTickCount%(1000/ServerTickTime) == 0 {
t.onTickSecond(now)
}
if t.globalTickCount%(10*5) == 0 {
if t.globalTickCount%(5000/ServerTickTime) == 0 {
t.onTick5Second(now)
}
if t.globalTickCount%(10*10) == 0 {
if t.globalTickCount%(10000/ServerTickTime) == 0 {
t.onTick10Second(now)
}
if t.globalTickCount%(10*60) == 0 {
if t.globalTickCount%(60000/ServerTickTime) == 0 {
t.onTickMinute(now)
}
if t.globalTickCount%(10*60*10) == 0 {
t.onTick10Minute(now)
}
if t.globalTickCount%(10*3600) == 0 {
if t.globalTickCount%(60000*60/ServerTickTime) == 0 {
t.onTickHour(now)
}
if t.globalTickCount%(10*3600*24) == 0 {
if t.globalTickCount%(60000*60*24/ServerTickTime) == 0 {
t.onTickDay(now)
}
if t.globalTickCount%(10*3600*24*7) == 0 {
if t.globalTickCount%(60000*60*24*7/ServerTickTime) == 0 {
t.onTickWeek(now)
}
for userId, userTick := range t.userTickMap {
@@ -138,11 +143,12 @@ func (t *TickManager) OnGameServerTick() {
// 跳过还没到时间的定时器
continue
}
<-userTick.globalTick.C
userTick.globalTickCount++
if userTick.globalTickCount%(10*1) == 0 {
if userTick.globalTickCount%(1000/UserTickTime) == 0 {
t.onUserTickSecond(userId, now)
}
if userTick.globalTickCount%(10*60) == 0 {
if userTick.globalTickCount%(60000/UserTickTime) == 0 {
t.onUserTickMinute(userId, now)
}
for timerId, timer := range userTick.timerMap {
@@ -150,6 +156,7 @@ func (t *TickManager) OnGameServerTick() {
// 跳过还没到时间的定时器
continue
}
<-timer.timer.C
timer.timer.Stop()
delete(userTick.timerMap, timerId)
t.userTimerHandle(userId, timer.action)
@@ -169,20 +176,10 @@ func (t *TickManager) onTickHour(now int64) {
logger.Info("on tick hour, time: %v", now)
}
func (t *TickManager) onTick10Minute(now int64) {
for _, world := range WORLD_MANAGER.worldMap {
for _, player := range world.playerMap {
// 蓝球粉球
GAME_MANAGER.AddUserItem(player.PlayerID, []*UserItem{{ItemId: 223, ChangeCount: 1}}, true, 0)
GAME_MANAGER.AddUserItem(player.PlayerID, []*UserItem{{ItemId: 224, ChangeCount: 1}}, true, 0)
}
}
}
func (t *TickManager) onTickMinute(now int64) {
// GAME_MANAGER.ServerAnnounceNotify(100, "test123")
for _, world := range WORLD_MANAGER.worldMap {
for _, player := range world.playerMap {
for _, world := range WORLD_MANAGER.GetAllWorld() {
for _, player := range world.GetAllPlayer() {
// 随机物品
allItemDataConfig := GAME_MANAGER.GetAllItemDataConfig()
count := random.GetRandomInt32(0, 4)
@@ -208,131 +205,133 @@ func (t *TickManager) onTickMinute(now int64) {
GAME_MANAGER.AddUserItem(player.PlayerID, []*UserItem{{ItemId: 201, ChangeCount: 10}}, true, 0)
GAME_MANAGER.AddUserItem(player.PlayerID, []*UserItem{{ItemId: 202, ChangeCount: 100}}, true, 0)
GAME_MANAGER.AddUserItem(player.PlayerID, []*UserItem{{ItemId: 203, ChangeCount: 10}}, true, 0)
// 蓝球粉球
GAME_MANAGER.AddUserItem(player.PlayerID, []*UserItem{{ItemId: 223, ChangeCount: 1}}, true, 0)
GAME_MANAGER.AddUserItem(player.PlayerID, []*UserItem{{ItemId: 224, ChangeCount: 1}}, true, 0)
}
}
}
func (t *TickManager) onTick10Second(now int64) {
for _, world := range WORLD_MANAGER.worldMap {
for _, scene := range world.sceneMap {
for _, player := range scene.playerMap {
for _, world := range WORLD_MANAGER.GetAllWorld() {
for _, scene := range world.GetAllScene() {
for _, player := range scene.GetAllPlayer() {
sceneTimeNotify := &proto.SceneTimeNotify{
SceneId: player.SceneId,
SceneTime: uint64(scene.GetSceneTime()),
}
GAME_MANAGER.SendMsg(cmd.SceneTimeNotify, player.PlayerID, 0, sceneTimeNotify)
playerTimeNotify := &proto.PlayerTimeNotify{
IsPaused: player.Pause,
PlayerTime: uint64(player.TotalOnlineTime),
ServerTime: uint64(time.Now().UnixMilli()),
}
GAME_MANAGER.SendMsg(cmd.PlayerTimeNotify, player.PlayerID, 0, playerTimeNotify)
}
}
for _, player := range world.GetAllPlayer() {
playerTimeNotify := &proto.PlayerTimeNotify{
IsPaused: player.Pause,
PlayerTime: uint64(player.TotalOnlineTime),
ServerTime: uint64(time.Now().UnixMilli()),
}
GAME_MANAGER.SendMsg(cmd.PlayerTimeNotify, player.PlayerID, 0, playerTimeNotify)
}
}
}
func (t *TickManager) onTick5Second(now int64) {
for _, world := range WORLD_MANAGER.worldMap {
for _, world := range WORLD_MANAGER.GetAllWorld() {
if world.IsBigWorld() {
for applyUid := range world.owner.CoopApplyMap {
GAME_MANAGER.UserDealEnterWorld(world.owner, applyUid, true)
}
}
for _, player := range world.playerMap {
// 多人世界其他玩家的坐标位置广播
worldPlayerLocationNotify := &proto.WorldPlayerLocationNotify{
PlayerWorldLocList: make([]*proto.PlayerWorldLocationInfo, 0),
// 多人世界其他玩家的坐标位置广播
worldPlayerLocationNotify := &proto.WorldPlayerLocationNotify{
PlayerWorldLocList: make([]*proto.PlayerWorldLocationInfo, 0),
}
for _, worldPlayer := range world.GetAllPlayer() {
playerWorldLocationInfo := &proto.PlayerWorldLocationInfo{
SceneId: worldPlayer.SceneId,
PlayerLoc: &proto.PlayerLocationInfo{
Uid: worldPlayer.PlayerID,
Pos: &proto.Vector{
X: float32(worldPlayer.Pos.X),
Y: float32(worldPlayer.Pos.Y),
Z: float32(worldPlayer.Pos.Z),
},
Rot: &proto.Vector{
X: float32(worldPlayer.Rot.X),
Y: float32(worldPlayer.Rot.Y),
Z: float32(worldPlayer.Rot.Z),
},
},
}
for _, worldPlayer := range world.playerMap {
playerWorldLocationInfo := &proto.PlayerWorldLocationInfo{
SceneId: worldPlayer.SceneId,
PlayerLoc: &proto.PlayerLocationInfo{
Uid: worldPlayer.PlayerID,
Pos: &proto.Vector{
X: float32(worldPlayer.Pos.X),
Y: float32(worldPlayer.Pos.Y),
Z: float32(worldPlayer.Pos.Z),
},
Rot: &proto.Vector{
X: float32(worldPlayer.Rot.X),
Y: float32(worldPlayer.Rot.Y),
Z: float32(worldPlayer.Rot.Z),
},
worldPlayerLocationNotify.PlayerWorldLocList = append(worldPlayerLocationNotify.PlayerWorldLocList, playerWorldLocationInfo)
}
GAME_MANAGER.SendToWorldA(world, cmd.WorldPlayerLocationNotify, 0, worldPlayerLocationNotify)
for _, scene := range world.GetAllScene() {
scenePlayerLocationNotify := &proto.ScenePlayerLocationNotify{
SceneId: scene.id,
PlayerLocList: make([]*proto.PlayerLocationInfo, 0),
VehicleLocList: make([]*proto.VehicleLocationInfo, 0),
}
for _, scenePlayer := range scene.GetAllPlayer() {
// 玩家位置
playerLocationInfo := &proto.PlayerLocationInfo{
Uid: scenePlayer.PlayerID,
Pos: &proto.Vector{
X: float32(scenePlayer.Pos.X),
Y: float32(scenePlayer.Pos.Y),
Z: float32(scenePlayer.Pos.Z),
},
Rot: &proto.Vector{
X: float32(scenePlayer.Rot.X),
Y: float32(scenePlayer.Rot.Y),
Z: float32(scenePlayer.Rot.Z),
},
}
worldPlayerLocationNotify.PlayerWorldLocList = append(worldPlayerLocationNotify.PlayerWorldLocList, playerWorldLocationInfo)
}
GAME_MANAGER.SendMsg(cmd.WorldPlayerLocationNotify, player.PlayerID, 0, worldPlayerLocationNotify)
for _, scene := range world.sceneMap {
scenePlayerLocationNotify := &proto.ScenePlayerLocationNotify{
SceneId: scene.id,
PlayerLocList: make([]*proto.PlayerLocationInfo, 0),
VehicleLocList: make([]*proto.VehicleLocationInfo, 0),
}
for _, scenePlayer := range scene.playerMap {
// 玩家位置
playerLocationInfo := &proto.PlayerLocationInfo{
Uid: scenePlayer.PlayerID,
Pos: &proto.Vector{
X: float32(scenePlayer.Pos.X),
Y: float32(scenePlayer.Pos.Y),
Z: float32(scenePlayer.Pos.Z),
},
Rot: &proto.Vector{
X: float32(scenePlayer.Rot.X),
Y: float32(scenePlayer.Rot.Y),
Z: float32(scenePlayer.Rot.Z),
},
}
scenePlayerLocationNotify.PlayerLocList = append(scenePlayerLocationNotify.PlayerLocList, playerLocationInfo)
// 载具位置
for _, entityId := range scenePlayer.VehicleInfo.LastCreateEntityIdMap {
entity := scene.GetEntity(entityId)
// 确保实体类型是否为载具
if entity != nil && entity.gadgetEntity != nil && entity.gadgetEntity.gadgetVehicleEntity != nil {
vehicleLocationInfo := &proto.VehicleLocationInfo{
Rot: &proto.Vector{
X: float32(entity.rot.X),
Y: float32(entity.rot.Y),
Z: float32(entity.rot.Z),
},
EntityId: entity.id,
CurHp: entity.fightProp[uint32(constant.FightPropertyConst.FIGHT_PROP_CUR_HP)],
OwnerUid: entity.gadgetEntity.gadgetVehicleEntity.owner.PlayerID,
Pos: &proto.Vector{
X: float32(entity.pos.X),
Y: float32(entity.pos.Y),
Z: float32(entity.pos.Z),
},
UidList: make([]uint32, 0, len(entity.gadgetEntity.gadgetVehicleEntity.memberMap)),
GadgetId: entity.gadgetEntity.gadgetVehicleEntity.vehicleId,
MaxHp: entity.fightProp[uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP)],
}
for _, p := range entity.gadgetEntity.gadgetVehicleEntity.memberMap {
vehicleLocationInfo.UidList = append(vehicleLocationInfo.UidList, p.PlayerID)
}
scenePlayerLocationNotify.VehicleLocList = append(scenePlayerLocationNotify.VehicleLocList, vehicleLocationInfo)
scenePlayerLocationNotify.PlayerLocList = append(scenePlayerLocationNotify.PlayerLocList, playerLocationInfo)
// 载具位置
for _, entityId := range scenePlayer.VehicleInfo.LastCreateEntityIdMap {
entity := scene.GetEntity(entityId)
// 确保实体类型是否为载具
if entity != nil && entity.gadgetEntity != nil && entity.gadgetEntity.gadgetVehicleEntity != nil {
vehicleLocationInfo := &proto.VehicleLocationInfo{
Rot: &proto.Vector{
X: float32(entity.rot.X),
Y: float32(entity.rot.Y),
Z: float32(entity.rot.Z),
},
EntityId: entity.id,
CurHp: entity.fightProp[uint32(constant.FightPropertyConst.FIGHT_PROP_CUR_HP)],
OwnerUid: entity.gadgetEntity.gadgetVehicleEntity.owner.PlayerID,
Pos: &proto.Vector{
X: float32(entity.pos.X),
Y: float32(entity.pos.Y),
Z: float32(entity.pos.Z),
},
UidList: make([]uint32, 0, len(entity.gadgetEntity.gadgetVehicleEntity.memberMap)),
GadgetId: entity.gadgetEntity.gadgetVehicleEntity.vehicleId,
MaxHp: entity.fightProp[uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP)],
}
for _, p := range entity.gadgetEntity.gadgetVehicleEntity.memberMap {
vehicleLocationInfo.UidList = append(vehicleLocationInfo.UidList, p.PlayerID)
}
scenePlayerLocationNotify.VehicleLocList = append(scenePlayerLocationNotify.VehicleLocList, vehicleLocationInfo)
}
}
GAME_MANAGER.SendMsg(cmd.ScenePlayerLocationNotify, player.PlayerID, 0, scenePlayerLocationNotify)
}
GAME_MANAGER.SendToWorldA(world, cmd.ScenePlayerLocationNotify, 0, scenePlayerLocationNotify)
}
}
}
func (t *TickManager) onTickSecond(now int64) {
for _, world := range WORLD_MANAGER.worldMap {
for _, player := range world.playerMap {
for _, world := range WORLD_MANAGER.GetAllWorld() {
for _, player := range world.GetAllPlayer() {
// 世界里所有玩家的网络延迟广播
worldPlayerRTTNotify := &proto.WorldPlayerRTTNotify{
PlayerRttList: make([]*proto.PlayerRTTInfo, 0),
}
for _, worldPlayer := range world.playerMap {
for _, worldPlayer := range world.GetAllPlayer() {
playerRTTInfo := &proto.PlayerRTTInfo{Uid: worldPlayer.PlayerID, Rtt: worldPlayer.ClientRTT}
worldPlayerRTTNotify.PlayerRttList = append(worldPlayerRTTNotify.PlayerRttList, playerRTTInfo)
}
@@ -367,9 +366,9 @@ func (t *TickManager) onTickSecond(now int64) {
}
func (t *TickManager) onTick200MilliSecond(now int64) {
// 耐力消耗
for _, world := range WORLD_MANAGER.worldMap {
for _, player := range world.playerMap {
for _, world := range WORLD_MANAGER.GetAllWorld() {
for _, player := range world.GetAllPlayer() {
// 耐力消耗
GAME_MANAGER.SustainStaminaHandler(player)
GAME_MANAGER.VehicleRestoreStaminaHandler(player)
GAME_MANAGER.DrownBackHandler(player)
@@ -380,6 +379,20 @@ func (t *TickManager) onTick200MilliSecond(now int64) {
func (t *TickManager) onTick100MilliSecond(now int64) {
}
func (t *TickManager) onTick50MilliSecond(now int64) {
// 音乐播放器
for i := 0; i < len(AUDIO_CHAN); i++ {
bigWorld := WORLD_MANAGER.GetBigWorld()
GAME_MANAGER.SendToWorldA(bigWorld, cmd.SceneAudioNotify, 0, &proto.SceneAudioNotify{
Type: 5,
SourceUid: bigWorld.owner.PlayerID,
Param1: []uint32{1, <-AUDIO_CHAN},
Param2: nil,
Param3: nil,
})
}
}
func (t *TickManager) createMonster(scene *Scene) uint32 {
pos := &model.Vector{
X: 2747,