game_sync/robot/fishing/fishscene.go

237 lines
6.2 KiB
Go

package fishing
import (
"mongo.games.com/game/common"
"mongo.games.com/game/gamerule/fishing"
fish_proto "mongo.games.com/game/protocol/fishing"
player_proto "mongo.games.com/game/protocol/player"
server_proto "mongo.games.com/game/protocol/server"
"mongo.games.com/game/robot/base"
"mongo.games.com/game/srvdata"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
)
type FishingScene struct {
base.BaseScene
*fish_proto.SCFishingRoomInfo
s *netlib.Session
dbGameFree *server_proto.DB_GameFree //自由场数据
seats [fishing.MaxPlayer]*FishingPlayer
players map[int32]*FishingPlayer
fishes map[int32]*Fish
syncedPolicy map[int64]struct{}
logicTick int32 //当前刷鱼逻辑时钟
willExpiredMap map[int32]map[int32]*Fish //即将超期的鱼
}
func NewFishingScene(info *fish_proto.SCFishingRoomInfo) *FishingScene {
s := &FishingScene{
SCFishingRoomInfo: info,
players: make(map[int32]*FishingPlayer),
fishes: make(map[int32]*Fish),
syncedPolicy: make(map[int64]struct{}),
willExpiredMap: make(map[int32]map[int32]*Fish), //即将超期的鱼
logicTick: 0,
}
s.Init()
logger.Logger.Trace("NewFishingScene ")
return s
}
func (this *FishingScene) Init() {
this.dbGameFree = base.SceneMgrSingleton.GetSceneDBGameFree(this.GetRoomId(), this.GetGameFreeId())
}
func (this *FishingScene) Clear() {
for _, player := range this.players {
player.Clear()
}
for _, f := range this.fishes {
this.DelFish(f)
}
this.syncedPolicy = make(map[int64]struct{})
this.fishes = make(map[int32]*Fish)
this.willExpiredMap = make(map[int32]map[int32]*Fish)
}
func (this *FishingScene) AddPlayer(p base.IPlayer) {
if mp, ok := p.(*FishingPlayer); ok {
this.players[p.GetSnId()] = mp
this.seats[p.GetPos()] = mp
logger.Logger.Trace("playernum ", len(this.players))
}
}
func (this *FishingScene) DelPlayer(snid int32) {
if p, exist := this.players[snid]; exist && p != nil {
delete(this.players, snid)
this.seats[p.GetPos()] = nil
}
}
func (this *FishingScene) GetPlayerByPos(pos int32) base.IPlayer {
if pos >= 0 && pos < fishing.MaxPlayer {
return this.seats[pos]
}
return nil
}
func (this *FishingScene) GetPlayerBySnid(snid int32) base.IPlayer {
if p, exist := this.players[snid]; exist {
return p
}
return nil
}
func (this *FishingScene) GetMe(s *netlib.Session) base.IPlayer {
if user, ok := s.GetAttribute(base.SessionAttributeUser).(*player_proto.SCPlayerData); ok {
player := this.GetPlayerBySnid(user.GetData().GetSnId())
return player
}
return nil
}
func (this *FishingScene) GetPlayerCount() int32 {
return int32(len(this.players))
}
func (this *FishingScene) IsFull() bool {
return len(this.players) >= int(fishing.MaxPlayer)
}
func (this *FishingScene) InitPlayer(s *netlib.Session, p *FishingPlayer) {
}
// 玩家操作
const (
FishingPlayerOpFire int32 = iota //开炮
FishingPlayerOpHitFish //命中
FishingPlayerOpSetPower //切换倍率
FishingPlayerOpSelVip //切换VIP鱼炮
FishingPlayerOpRobotFire
FishingPlayerOpRobotHitFish
FishingPlayerOpLeave
FishingPlayerOpEnter
FishingPlayerOpAuto
FishingPlayerOpSelTarget
FishingPlayerOpFireRate
FishingRobotOpAuto
FishingRobotOpSetPower
FishingPlayerHangup
FishingRobotWantLeave
)
func (this *FishingScene) UpdateOnlinePlayers(onlinePlayers []int32) {
for iPos := 0; iPos < fishing.MaxPlayer; iPos++ {
seat := this.seats[iPos]
if seat != nil {
if common.InSliceInt32(onlinePlayers, seat.GetSnId()) == false {
this.DelPlayer(seat.GetSnId())
}
}
}
}
func (this *FishingScene) AllIsRobot() bool {
bAllIsRobot := true
for _, player := range this.players {
if base.PlayerMgrSingleton.GetPlayer(player.GetSnId()) == nil {
bAllIsRobot = false
}
}
return bAllIsRobot
}
func (this *FishingScene) Update(ts int64) {
//logger.Logger.Trace("FishingScene Update GetPlayerCount ", this.GetPlayerCount())
//清理过期的鱼
//this.DelExpiredFish(this.logicTick)
//this.logicTick++
//
//for _, player := range this.players {
// player.Update(ts)
//}
}
func (this *FishingScene) flushFish(policyId, logicTick int32) {
if _, exist := this.syncedPolicy[common.MakeI64(policyId, logicTick)]; exist {
//这波鱼已经刷过了
return
}
this.logicTick = logicTick
policyData := FishPolicyMgrSington.GetFishByTime(policyId, logicTick)
if len(policyData) <= 0 {
return
}
for _, value := range policyData {
fishRateData := srvdata.PBDB_FishRateMgr.GetData(value.GetFishId())
var coin int32
gold := fishRateData.GetGold()
if len(gold) > 0 {
coin = gold[0]
if len(gold) > 1 {
coin = int32(common.RandInt(int(gold[0]), int(gold[1])))
}
}
count := value.GetCount() // 获取当前的数量
for index := int32(0); index < int32(count); index++ {
id := policyId*1000000 + int32(value.GetId())*100 + int32(index+1) // 作为Fish的唯一标识
var birthTick = logicTick + index*value.GetRefreshInterval() // 这个条鱼出生的时间
var liveTick = birthTick + value.GetTimeToLive()*10 // 这条鱼存货的时间
fish := NewFish(id, value.GetFishId(), coin, birthTick, liveTick) // 根据参数生成Fish对象
if fish != nil {
this.AddFish(fish)
}
}
}
}
func (this FishingScene) GetFish(id int32) *Fish {
return this.fishes[id]
}
func (this *FishingScene) AddFish(f *Fish) {
this.fishes[f.id] = f
willExpired := this.willExpiredMap[f.dieTick]
if willExpired == nil {
willExpired = make(map[int32]*Fish)
this.willExpiredMap[f.dieTick] = willExpired
}
willExpired[f.id] = f
}
func (this *FishingScene) DelFish(f *Fish) {
delete(this.fishes, f.id)
if willExpired, exist := this.willExpiredMap[f.dieTick]; exist {
delete(willExpired, f.id)
}
}
func (this *FishingScene) DelExpiredFish(logicTick int32) {
if expired, exist := this.willExpiredMap[logicTick]; exist {
for _, f := range expired {
this.DelFish(f)
}
}
}
func (this *FishingScene) RandGetOneFish() *Fish {
for _, f := range this.fishes {
if f.birthTick > this.logicTick || f.dieTick < this.logicTick { //还未出生|已经死亡
continue
}
return f
}
return nil
}