RefreshActorHUDHPLabelCommand.lua 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. local RefreshActorHUDHPLabelCommand = class('RefreshActorHUDHPLabelCommand', framework.SimpleCommand)
  2. local optionsUtils = requireProxy("optionsUtils")
  3. local MMO = global.MMO
  4. local HudType = MMO.HUD_TYPE_BATCH_LABEL
  5. local HudIndex = MMO.HUD_LABEL_HP
  6. local sformat = string.format
  7. local hPos = global.isWinPlayMode and cc.p(2, 62) or (SL:GetMetaValue("GAME_DATA", "MobileHudNotUseBmpFont") == 1 and cc.p(2, 62) or cc.p(2, 55) )
  8. local oriHPosY = hPos.y
  9. local GetJobMask = function (job)
  10. local jobStr = {
  11. [0] = "Z",
  12. [1] = "F",
  13. [2] = "D"
  14. }
  15. -- 多职业未配置默认X
  16. if job >= 5 and job <= 15 then
  17. local jobData = SL:GetMetaValue("GAME_DATA", "MultipleJobSetMap")[job]
  18. local isOpen = jobData and jobData.isOpen
  19. local str = isOpen and jobData.hudStr or "X"
  20. return str
  21. end
  22. return jobStr[job] or "Z"
  23. end
  24. -- 是否显示怪物等级
  25. local IsShowMonsterLv = SL:GetMetaValue("GAME_DATA", "Monsterlevel") == 1
  26. function RefreshActorHUDHPLabelCommand:ctor()
  27. end
  28. function RefreshActorHUDHPLabelCommand:execute(notification)
  29. local actor = notification:getBody()
  30. if not actor then
  31. return false
  32. end
  33. local visible = actor:GetValueByKey(MMO.HUD_HMPLabel_VISIBLE)
  34. local label = self:GetLabel(actor, visible)
  35. self:refreshContent(actor, label)
  36. -- refresh actor position
  37. local pos = actor:getPosition()
  38. actor:setPosition(pos.x, pos.y)
  39. end
  40. function RefreshActorHUDHPLabelCommand:GetLabel(actor, visible)
  41. local actorID = actor:GetID()
  42. local label = global.HUDManager:GetHUD(actorID, HudType, HudIndex)
  43. if not visible and label then
  44. global.HUDManager:RemoveHUD(actorID, HudType, HudIndex)
  45. return false
  46. end
  47. if not label then
  48. if SL:GetMetaValue("GAME_DATA", "HPLabelFollowHUDPosY") == 1 then
  49. local hudHPY = global.MMO.HUD_OFFSET_1 and global.MMO.HUD_OFFSET_1.y
  50. hPos.y = global.isWinPlayMode and hudHPY + 12 or (SL:GetMetaValue("GAME_DATA", "MobileHudNotUseBmpFont") == 1 and (hudHPY + 12) or (hudHPY + 5))
  51. else
  52. hPos.y = oriHPosY
  53. end
  54. -- 配置偏移
  55. local setOffsetYTab = global.ConstantConfig.HudLabelShowOffsetYMap
  56. if actor:IsPlayer() then
  57. hPos.y = hPos.y + (setOffsetYTab[2] or 0)
  58. elseif actor:IsMonster() then
  59. hPos.y = hPos.y + (setOffsetYTab[4] or 0)
  60. end
  61. label = global.HUDManager:CreateHUD(actorID, HudType, HudIndex, cc.p(hPos.x, hPos.y))
  62. label:setAlignment(cc.TEXT_ALIGNMENT_CENTER, cc.VERTICAL_TEXT_ALIGNMENT_BOTTOM)
  63. end
  64. label:setVisible(visible)
  65. return label
  66. end
  67. function RefreshActorHUDHPLabelCommand:refreshContent(actor, label)
  68. if not label then
  69. return false
  70. end
  71. local Hp = actor:GetHP()
  72. if not Hp then
  73. return false
  74. end
  75. local MaxHp = actor:GetMaxHP()
  76. if not MaxHp then
  77. return false
  78. end
  79. local MP = 0
  80. local maxMP = 0
  81. if actor:GetValueByKey(MMO.HUD_MPBAR_VISIBLE) then
  82. MP = actor:GetMP() or 0
  83. maxMP = actor:GetMaxMP() or 0
  84. end
  85. -- 浑水摸鱼 显示百分比
  86. local mapProxy = global.Facade:retrieveProxy(global.ProxyTable.Map)
  87. if mapProxy:IsHPPercent() then
  88. Hp = math.ceil( ((Hp+MP) / (MaxHp+maxMP)) * 100 )
  89. MP = 0
  90. MaxHp = 100
  91. end
  92. local formatStr = GET_STRING(1053)
  93. if mapProxy:IsForbidLvJob() or CHECK_SETTING(MMO.SETTING_IDX_PLAYER_JOB_LEVEL) ~= 1 then
  94. local hpStr = sformat(formatStr, SL:HPUnit(Hp + MP), SL:HPUnit(MaxHp))
  95. return label:setString(hpStr)
  96. end
  97. local levelJob = nil
  98. if actor:IsPlayer() then
  99. levelJob = GetJobMask(actor:GetJobID()) .. actor:GetLevel() or ""
  100. elseif actor:IsMonster()then
  101. if IsShowMonsterLv then
  102. levelJob = "J" .. actor:GetLevel() or ""
  103. end
  104. end
  105. -- 只显示职业等级
  106. if GET_SETTING(MMO.SETTING_IDX_PLAYER_JOB_LEVEL) == 1 then
  107. return label:setString(levelJob)
  108. end
  109. local hpStr = sformat(formatStr, SL:HPUnit(Hp + MP), SL:HPUnit(MaxHp))
  110. if levelJob then
  111. hpStr = sformat(formatStr, hpStr, levelJob)
  112. end
  113. label:setString(hpStr)
  114. end
  115. return RefreshActorHUDHPLabelCommand