player_asset.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package mapPlayer
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/data"
  5. "f1-game/internal/enum"
  6. "f1-game/internal/event"
  7. nameEvent "f1-game/internal/name/event"
  8. nameRemote "f1-game/internal/name/remote"
  9. "f1-game/internal/pb"
  10. "f1-game/internal/types"
  11. ao "f1-game/nodes/game/player/asset/origin"
  12. assetOrigin "f1-game/nodes/game/player/asset/origin"
  13. "f1-game/nodes/map/internal/db"
  14. mapFacade "f1-game/nodes/map/internal/facade"
  15. "f1-game/nodes/map/player/facility"
  16. "f1-game/nodes/map/player/player"
  17. "f1-game/nodes/map/player/season"
  18. cfacade "github.com/cherry-game/cherry/facade"
  19. )
  20. // 初始化地图货币路由接口
  21. func (p *actorPlayer) initAsset() {
  22. p.Remote().Register(nameRemote.MapPlayer_AssetAdd, p.assetAdd)
  23. p.Remote().Register(nameRemote.MapPlayer_AssetSub, p.assetSub)
  24. p.Remote().Register(nameRemote.MapPlayer_AssetCheck, p.assetCheck)
  25. p.EventRegister(nameEvent.Item_Add, p.onItemAddUpdate)
  26. p.EventRegister(nameEvent.Map_PlayerTileSiege, p.onTileSiegeAddContribution)
  27. p.EventRegister(nameEvent.Lord_FacilityUp, p.onFacilityUpAddContribution)
  28. }
  29. // assetAdd 添加资产
  30. func (p *actorPlayer) assetAdd(req *pb.PlayerAddAssets) (*pb.AssetList, int32) {
  31. var (
  32. ao = assetOrigin.Get(req.Origin)
  33. mapAddAssets = types.Assets{}
  34. push = p.isOnline
  35. )
  36. for _, asset := range req.AddAssets {
  37. if !enum.IsMapCurrency(asset.Id) && !enum.IsLeagueCurrency(asset.Id) {
  38. continue
  39. }
  40. mapAddAssets.AddAsset(&types.Asset{
  41. ID: asset.Id,
  42. Num: asset.Num,
  43. })
  44. }
  45. // 玩家在线才推送
  46. retAssets, errCode := mapFacade.Storage.AssetAdds(p.playerID, mapAddAssets, ao, push)
  47. rsp := retAssets.ToAssetListProto()
  48. return &rsp, errCode
  49. }
  50. // assetSub 扣除资产
  51. func (p *actorPlayer) assetSub(req *pb.PlayerAddAssets) (*pb.AssetList, int32) {
  52. var (
  53. ao = assetOrigin.Get(req.Origin)
  54. mapAddAssets = types.Assets{}
  55. )
  56. // 过滤game节点的资源,避免循环callWait
  57. for _, asset := range req.AddAssets {
  58. if !enum.IsMapCurrency(asset.Id) {
  59. continue
  60. }
  61. mapAddAssets.AddAsset(&types.Asset{
  62. ID: asset.Id,
  63. Num: asset.Num,
  64. })
  65. }
  66. if len(mapAddAssets) == 0 {
  67. return nil, code.IllegalArgument
  68. }
  69. retAssets, errCode := mapFacade.Storage.AssetSubs(p.playerID, mapAddAssets, ao, true)
  70. rsp := retAssets.ToAssetListProto()
  71. return &rsp, errCode
  72. }
  73. // assetSub 检测地图资产
  74. func (p *actorPlayer) assetCheck(req *pb.AssetList) int32 {
  75. var (
  76. mapAssets = types.Assets{}
  77. )
  78. for _, asset := range req.List {
  79. mapAssets.AddAsset(&types.Asset{
  80. ID: asset.Id,
  81. Num: asset.Num,
  82. })
  83. }
  84. if !mapFacade.Storage.IsAllEnough(p.playerID, mapAssets) {
  85. return code.CurrencyNotEnough
  86. }
  87. return code.OK
  88. }
  89. // 道具获得转化联盟经验
  90. func (p *actorPlayer) onItemAddUpdate(e cfacade.IEventData) {
  91. evt, ok := e.(*event.ItemAdd)
  92. if !ok {
  93. return
  94. }
  95. // 获得功勋、帝国晶矿和联盟贡献值
  96. var addFeat, addCrystalMine, addLeagueContribute int64
  97. for _, asset := range evt.Assets() {
  98. switch asset.ID {
  99. case enum.ItemIDFeat:
  100. // 武勋
  101. addFeat += asset.Num
  102. case enum.ItemIDCrystalMine:
  103. // 帝国金矿(沙盘经验)
  104. addCrystalMine += asset.Num
  105. case enum.ItemIDContribution:
  106. // 联盟贡献值
  107. addLeagueContribute += asset.Num
  108. }
  109. }
  110. // 获得帝国晶矿
  111. if addCrystalMine > 0 {
  112. // 转化成个人贡献值 按照比例折算
  113. leagueContribute := data.Const.CalCrystalMineToLeagueCon(addCrystalMine)
  114. mapFacade.Storage.AssetAddOne(p.playerID, enum.ItemIDContribution, leagueContribute, ao.None, p.isOnline)
  115. p.Warn("get league contribut value. playerID=%d, value=%d", p.playerID, leagueContribute)
  116. }
  117. // 更新个人功勋排行榜
  118. if addFeat > 0 {
  119. player.Service().SyncPlayerFeatRank(p.playerID)
  120. }
  121. // 刷新联盟经验
  122. player.Service().CheckAndAddLeagueExp(p.playerID, addFeat, addLeagueContribute)
  123. // 刷新玩家赛季积分
  124. season.Service().UpdatePlayerSeasonScore(p.playerID, addFeat, addLeagueContribute)
  125. }
  126. // 攻城值转换成联盟贡献值
  127. func (p *actorPlayer) onTileSiegeAddContribution(e cfacade.IEventData) {
  128. playerTable := db.GetMapPlayerTable(p.playerID)
  129. // 未加入联盟 跳过
  130. if playerTable.LeagueID <= 0 {
  131. return
  132. }
  133. evt, ok := e.(*event.TileSiege)
  134. if !ok {
  135. return
  136. }
  137. // 计算贡献值
  138. tileSiege := evt.TileSiege()
  139. // 获得联盟贡献
  140. leagueContribute := data.Const.CalSiegeToLeagueCon(int64(tileSiege.Value))
  141. if leagueContribute <= 0 {
  142. return
  143. }
  144. // 获得联盟贡献值
  145. mapFacade.Storage.AssetAddOne(p.playerID, enum.ItemIDContribution, leagueContribute, ao.None, p.isOnline)
  146. }
  147. // 城建创建繁荣度差值增加联盟贡献
  148. func (p *actorPlayer) onFacilityUpAddContribution(e cfacade.IEventData) {
  149. playerTable := db.GetMapPlayerTable(p.playerID)
  150. // 未加入联盟 跳过
  151. if playerTable.LeagueID <= 0 {
  152. return
  153. }
  154. evt, ok := e.(*event.FacilityUp)
  155. if !ok {
  156. return
  157. }
  158. var (
  159. facilityID = evt.FacilityID()
  160. curLevel = evt.Level()
  161. preLevel = curLevel - 1
  162. )
  163. // 声望差值
  164. diffPrestige := facility.Service().GetFacilityLevelDiffPrestige(facilityID, preLevel, curLevel)
  165. if diffPrestige <= 0 {
  166. return
  167. }
  168. // 获得联盟贡献值
  169. leagueContribute := data.Const.CalFacilityToLeagueCon(diffPrestige)
  170. if leagueContribute <= 0 {
  171. return
  172. }
  173. // 获得联盟贡献
  174. mapFacade.Storage.AssetAddOne(p.playerID, enum.ItemIDContribution, leagueContribute, ao.None, p.isOnline)
  175. }