package main import ( "math" "mongo.games.com/goserver/core/logger" "mongo.games.com/game/common" "mongo.games.com/game/model" hallproto "mongo.games.com/game/protocol/gamehall" "mongo.games.com/game/protocol/webapi" ) type ScenePolicyData struct { GameName string GameId int32 GameMode []int32 DefaultPlayerCnt int32 EnterAfterStart bool BetState int32 BaseScore int } func (spd *ScenePolicyData) Init() bool { return true } func (spd *ScenePolicyData) OnStart(s *Scene) { s.NotifyPrivateRoom(common.ListAdd) } // 场景关闭事件 func (spd *ScenePolicyData) OnStop(s *Scene) { s.NotifyPrivateRoom(common.ListDel) // 房主付费,房间没有玩就解散了,返还房主建房费用 if s.IsCustom() && s.GetCostType() == 2 && s.currRound == 0 { spd.GiveCostPayment(s, s.creator) } } // 场景心跳事件 func (spd *ScenePolicyData) OnTick(s *Scene) { } // 玩家进入事件 func (spd *ScenePolicyData) OnPlayerEnter(s *Scene, p *Player) { s.NotifyPrivateRoom(common.ListModify) } // 玩家离开事件 func (spd *ScenePolicyData) OnPlayerLeave(s *Scene, p *Player) { s.NotifyPrivateRoom(common.ListModify) } // 系统维护关闭事件 func (spd *ScenePolicyData) OnShutdown(s *Scene) { } func (spd *ScenePolicyData) OnSceneState(s *Scene, state int) { s.SceneState = int32(state) switch state { case common.SceneStateWaite: s.NotifyPrivateRoom(common.ListModify) case common.SceneStateStart: s.NotifyPrivateRoom(common.ListModify) if s.IsCustom() { if s.GetCostType() == 1 { for _, v := range s.players { spd.CostPayment(s, v) } } } case common.SceneStateEnd: s.NotifyPrivateRoom(common.ListModify) } } func (spd *ScenePolicyData) OnGameState(s *Scene, state int) { } // 能否进入 func (spd *ScenePolicyData) CanEnter(s *Scene, p *Player) int { if !spd.EnterAfterStart { if s.starting { return int(hallproto.OpResultCode_Game_OPRC_GameStarting_Game) } } return 0 } func (spd *ScenePolicyData) costEnough(costType, playerNum int, roomConfig *webapi.RoomConfig, snid int32, f func(items []*model.Item)) bool { isEnough := true var items []*model.Item if costType == 2 { // 房主 for _, v := range roomConfig.GetCost() { if item := BagMgrSingleton.GetItem(snid, v.GetItemId()); item == nil || item.ItemNum < v.GetItemNum() { isEnough = false break } else { items = append(items, &model.Item{ ItemId: v.GetItemId(), ItemNum: v.GetItemNum(), }) } } } else { // AA for _, v := range roomConfig.GetCost() { n := int64(math.Ceil(float64(v.GetItemNum()) / float64(playerNum))) if item := BagMgrSingleton.GetItem(snid, v.GetItemId()); item == nil || item.ItemNum < n { isEnough = false break } else { items = append(items, &model.Item{ ItemId: v.GetItemId(), ItemNum: n, }) } } } if isEnough { f(items) } return isEnough } func (spd *ScenePolicyData) CostEnough(costType, playerNum int, roomConfig *webapi.RoomConfig, p *Player) bool { if roomConfig == nil { return false } return spd.costEnough(costType, playerNum, roomConfig, p.SnId, func(items []*model.Item) {}) } func (spd *ScenePolicyData) CostPayment(s *Scene, p *Player) bool { roomConfig := PlatformMgrSingleton.GetConfig(p.Platform).RoomConfig[s.GetRoomConfigId()] if roomConfig == nil { return false } return spd.costEnough(int(s.GetCostType()), s.playerNum, roomConfig, p.SnId, func(items []*model.Item) { for _, v := range items { v.ItemNum = -v.ItemNum } BagMgrSingleton.AddItems(&model.AddItemParam{ Platform: p.Platform, SnId: p.SnId, Change: items, GainWay: common.GainWayRoomCost, Operator: "system", Remark: "竞技馆进房费用", GameId: int64(s.gameId), GameFreeId: int64(s.dbGameFree.GetId()), RoomConfigId: roomConfig.GetId(), }) }) } // GiveCostPayment 退房费 func (spd *ScenePolicyData) GiveCostPayment(s *Scene, snid int32) bool { roomConfig := PlatformMgrSingleton.GetConfig(s.limitPlatform.IdStr).RoomConfig[s.GetRoomConfigId()] if roomConfig == nil { return false } if s.GetCostType() != 2 { // 只有房主付费才有返还 return false } var items []*model.Item for _, v := range roomConfig.GetCost() { items = append(items, &model.Item{ ItemId: v.GetItemId(), ItemNum: v.GetItemNum(), }) } p := PlayerMgrSington.GetPlayerBySnId(snid) if p != nil { BagMgrSingleton.AddItems(&model.AddItemParam{ Platform: p.Platform, SnId: p.SnId, Change: items, GainWay: common.GainWayRoomCost, Operator: "system", Remark: "竞技场房间费用返还", GameId: int64(s.gameId), GameFreeId: int64(s.dbGameFree.GetId()), NoLog: false, RoomConfigId: roomConfig.GetId(), }) } else { BagMgrSingleton.AddItemsOffline(&model.AddItemParam{ Platform: s.limitPlatform.IdStr, SnId: snid, Change: items, GainWay: common.GainWayRoomCost, Operator: "system", Remark: "竞技场房间费用返还", GameId: int64(s.gameId), GameFreeId: int64(s.dbGameFree.GetId()), NoLog: false, RoomConfigId: roomConfig.GetId(), }, func(err error) { logger.Logger.Errorf("竞技场房间费用返还失败, err: %v", err) }) } return false } func (spd *ScenePolicyData) GetBetState() int32 { return spd.BetState } func (spd *ScenePolicyData) GetPlayerNum() int { return int(spd.DefaultPlayerCnt) } func (spd *ScenePolicyData) GetBaseScore() int { return int(spd.BaseScore) }