| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- 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,
- }))
- }
|