package mapPlayer import ( "f1-game/internal/code" "f1-game/internal/data" "f1-game/internal/enum" "f1-game/internal/event" nameEvent "f1-game/internal/name/event" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/internal/types" ao "f1-game/nodes/game/player/asset/origin" assetOrigin "f1-game/nodes/game/player/asset/origin" "f1-game/nodes/map/internal/db" mapFacade "f1-game/nodes/map/internal/facade" "f1-game/nodes/map/player/facility" "f1-game/nodes/map/player/player" "f1-game/nodes/map/player/season" cfacade "github.com/cherry-game/cherry/facade" ) // 初始化地图货币路由接口 func (p *actorPlayer) initAsset() { p.Remote().Register(nameRemote.MapPlayer_AssetAdd, p.assetAdd) p.Remote().Register(nameRemote.MapPlayer_AssetSub, p.assetSub) p.Remote().Register(nameRemote.MapPlayer_AssetCheck, p.assetCheck) p.EventRegister(nameEvent.Item_Add, p.onItemAddUpdate) p.EventRegister(nameEvent.Map_PlayerTileSiege, p.onTileSiegeAddContribution) p.EventRegister(nameEvent.Lord_FacilityUp, p.onFacilityUpAddContribution) } // assetAdd 添加资产 func (p *actorPlayer) assetAdd(req *pb.PlayerAddAssets) (*pb.AssetList, int32) { var ( ao = assetOrigin.Get(req.Origin) mapAddAssets = types.Assets{} push = p.isOnline ) for _, asset := range req.AddAssets { if !enum.IsMapCurrency(asset.Id) && !enum.IsLeagueCurrency(asset.Id) { continue } mapAddAssets.AddAsset(&types.Asset{ ID: asset.Id, Num: asset.Num, }) } // 玩家在线才推送 retAssets, errCode := mapFacade.Storage.AssetAdds(p.playerID, mapAddAssets, ao, push) rsp := retAssets.ToAssetListProto() return &rsp, errCode } // assetSub 扣除资产 func (p *actorPlayer) assetSub(req *pb.PlayerAddAssets) (*pb.AssetList, int32) { var ( ao = assetOrigin.Get(req.Origin) mapAddAssets = types.Assets{} ) // 过滤game节点的资源,避免循环callWait for _, asset := range req.AddAssets { if !enum.IsMapCurrency(asset.Id) { continue } mapAddAssets.AddAsset(&types.Asset{ ID: asset.Id, Num: asset.Num, }) } if len(mapAddAssets) == 0 { return nil, code.IllegalArgument } retAssets, errCode := mapFacade.Storage.AssetSubs(p.playerID, mapAddAssets, ao, true) rsp := retAssets.ToAssetListProto() return &rsp, errCode } // assetSub 检测地图资产 func (p *actorPlayer) assetCheck(req *pb.AssetList) int32 { var ( mapAssets = types.Assets{} ) for _, asset := range req.List { mapAssets.AddAsset(&types.Asset{ ID: asset.Id, Num: asset.Num, }) } if !mapFacade.Storage.IsAllEnough(p.playerID, mapAssets) { return code.CurrencyNotEnough } return code.OK } // 道具获得转化联盟经验 func (p *actorPlayer) onItemAddUpdate(e cfacade.IEventData) { evt, ok := e.(*event.ItemAdd) if !ok { return } // 获得功勋、帝国晶矿和联盟贡献值 var addFeat, addCrystalMine, addLeagueContribute int64 for _, asset := range evt.Assets() { switch asset.ID { case enum.ItemIDFeat: // 武勋 addFeat += asset.Num case enum.ItemIDCrystalMine: // 帝国金矿(沙盘经验) addCrystalMine += asset.Num case enum.ItemIDContribution: // 联盟贡献值 addLeagueContribute += asset.Num } } // 获得帝国晶矿 if addCrystalMine > 0 { // 转化成个人贡献值 按照比例折算 leagueContribute := data.Const.CalCrystalMineToLeagueCon(addCrystalMine) mapFacade.Storage.AssetAddOne(p.playerID, enum.ItemIDContribution, leagueContribute, ao.None, p.isOnline) p.Warn("get league contribut value. playerID=%d, value=%d", p.playerID, leagueContribute) } // 更新个人功勋排行榜 if addFeat > 0 { player.Service().SyncPlayerFeatRank(p.playerID) } // 刷新联盟经验 player.Service().CheckAndAddLeagueExp(p.playerID, addFeat, addLeagueContribute) // 刷新玩家赛季积分 season.Service().UpdatePlayerSeasonScore(p.playerID, addFeat, addLeagueContribute) } // 攻城值转换成联盟贡献值 func (p *actorPlayer) onTileSiegeAddContribution(e cfacade.IEventData) { playerTable := db.GetMapPlayerTable(p.playerID) // 未加入联盟 跳过 if playerTable.LeagueID <= 0 { return } evt, ok := e.(*event.TileSiege) if !ok { return } // 计算贡献值 tileSiege := evt.TileSiege() // 获得联盟贡献 leagueContribute := data.Const.CalSiegeToLeagueCon(int64(tileSiege.Value)) if leagueContribute <= 0 { return } // 获得联盟贡献值 mapFacade.Storage.AssetAddOne(p.playerID, enum.ItemIDContribution, leagueContribute, ao.None, p.isOnline) } // 城建创建繁荣度差值增加联盟贡献 func (p *actorPlayer) onFacilityUpAddContribution(e cfacade.IEventData) { playerTable := db.GetMapPlayerTable(p.playerID) // 未加入联盟 跳过 if playerTable.LeagueID <= 0 { return } evt, ok := e.(*event.FacilityUp) if !ok { return } var ( facilityID = evt.FacilityID() curLevel = evt.Level() preLevel = curLevel - 1 ) // 声望差值 diffPrestige := facility.Service().GetFacilityLevelDiffPrestige(facilityID, preLevel, curLevel) if diffPrestige <= 0 { return } // 获得联盟贡献值 leagueContribute := data.Const.CalFacilityToLeagueCon(diffPrestige) if leagueContribute <= 0 { return } // 获得联盟贡献 mapFacade.Storage.AssetAddOne(p.playerID, enum.ItemIDContribution, leagueContribute, ao.None, p.isOnline) }