package mapLogic import ( capp "f1-game/internal/cherry_app" "f1-game/internal/data" "f1-game/internal/enum" "f1-game/internal/event" "f1-game/internal/types" mapCall "f1-game/nodes/map/internal/call" "f1-game/nodes/map/internal/db" clog "github.com/cherry-game/cherry/logger" ) func (p *actor) resTimer() { p.updateTime() for _, resTable := range p.ResTables { p.resTicker(resTable) if resTable.IsDataChanged { resTable.IsDataChanged = false resTable.Save2Queue() } } } func (p *actor) resTicker(resTable *db.LogicResTable) { if resTable.IsDelete { p.resInvalid(resTable) return } if resTable.IsDiscard() { p.doResDiscard(resTable) } } // resInvalid 资源点无效 func (p *actor) resInvalid(resTable *db.LogicResTable) { p.removeWatcherRes(resTable) // 清理地块 if !resTable.Point.IsZero() { tileTable := p.TileTables.GetValue(resTable.GetTileID()) tileTable.SetResObjectID(0) // 把驻守队列遣散 p.tileGarrionRetreat(tileTable) } p.removeRes(resTable) // resTable.IsDelete = true resTable.IsDataChanged = true } // resDead 资源死亡 func (p *actor) resDead(resTable *db.LogicResTable) { p.removeWatcherRes(resTable) // TODO: 资源死亡(被覆盖)要标记为删除,不然重启服务器又会跑出来 resTable.IsDelete = true // 清理地块上的资源对象ID tileTable := p.TileTables.GetValue(resTable.GetTileID()) tileTable.SetResObjectID(0) // 把地块上的驻守队伍遣散 p.tileGarrionRetreat(tileTable) p.addTileProcess(tileTable) // 资源点对象离开地图 mapCall.AOI.Leave(resTable.ObjectID, enum.ObjectType_Res) } func (p *actor) doResDiscard(resTable *db.LogicResTable) { if resTable.DiscardEndTime > p.nowMillis { return } clog.Debugf("Res discard: ResID = %v, PlayerID = %v", resTable.ObjectID, resTable.PlayerID) p.removeWatcherRes(resTable) resTable.ResetByDiscard() p.UpdateObjectFull(resTable.ObjectID, resTable.Type) // 把驻守队列遣散 tileTable := p.TileTables.GetValue(resTable.GetTileID()) p.tileGarrionRetreat(tileTable) p.addTileProcess(tileTable) } func (p *actor) addResAOI(resTable *db.LogicResTable) { marker := resTable.ToAOIMarker() mapCall.AOI.Enter(marker) } func (p *actor) removeRes(resTable *db.LogicResTable) { p.ResTables.Remove(resTable.ObjectID) } func (p *actor) resReplenish(points types.Points) { // 移除建筑补充被覆盖的资源点 resDatas := data.ResData() for _, point := range points { tileID, ok := data.PointToTileID(point.X, point.Y) if !ok { continue } resData, ok := resDatas[tileID] if !ok { continue } resRow, ok := data.MapRes.GetByConfigID(resData.ConfigId) if !ok { clog.Warnf("res config not found. tileID = %d, point = (%d, %d) ,configID = %d", tileID, point.X, point.Y, resData.ConfigId) continue } tileTable := p.TileTables.GetValue(tileID) if tileTable.ResObjectID > 0 { continue } resTable := db.NewLogicResTable(db.NewGUID(), capp.NodeID(), point.X, point.Y, resRow.ConfigID) resTable.LoadConfigs(resRow) resTable.Init() resTable.Save2Queue() // 拷贝属性 p.ResTables.Put(resTable.ObjectID, resTable) // 存放到 tileTable tileTable.SetResObjectID(resTable.ObjectID) p.addTileProcess(tileTable) // 对象进入AOI p.addResAOI(resTable) } } func (p *actor) removeWatcherRes(resTable *db.LogicResTable) { if !resTable.HasPlayer() { return } // 删除玩家资源 watcherTable := p.WatcherTables.GetValue(resTable.PlayerID) watcherTable.RemoveRes(resTable.ObjectID) // 推送 p.PushOwnerMapObjectDel(resTable.PlayerID, resTable.ObjectID) // 抛事件 p.PostEvent(event.NewResUpdate(watcherTable.PlayerID, &event.MapResUpdateData{ ObjectID: resTable.ObjectID, UpdateType: enum.ResUpdate_Delete, })) }