237 lines
6.2 KiB
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
|
|
}
|