ConditionManager.lua 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. require "dev/Condition/ConditionBase"
  2. require "dev/Condition/LevelCondition"
  3. require "dev/Condition/TimeCondition"
  4. require "dev/Condition/CareerCondition"
  5. require "dev/Condition/RechargeCondition"
  6. require "dev/Condition/VIPCondition"
  7. require "dev/Condition/BagItemCondition"
  8. require "dev/Condition/UnionCondition"
  9. ConditionManager = {}
  10. local this = ConditionManager
  11. local excuterMap = {}
  12. ---获取条件类实例
  13. ---@param singleCondition string|table 单个条件
  14. ---@return ConditionBase
  15. function ConditionManager.GenerateSingleCondition(singleCondition)
  16. if( type(singleCondition) == "table")then
  17. local stype = singleCondition[1]
  18. local param = singleCondition[2] --singleCondition[2]
  19. if table.count(singleCondition) > 2 then
  20. param = {}
  21. for i = 2 ,table.count(singleCondition) do
  22. table.insert(param,singleCondition[i])
  23. end
  24. end
  25. local classNum = math.floor(stype / 100)
  26. local comparatorNum = stype % 100
  27. local instance
  28. local excuter = excuterMap[classNum]
  29. if excuter then
  30. instance = excuter(comparatorNum,param)
  31. else
  32. SL:LogError(string.format('%s类型条件不存..参数..%s',classNum,tostring(param)))
  33. end
  34. return instance
  35. else
  36. local strs = string.split(singleCondition,'#')
  37. local stype = tonumber(strs[1])
  38. local param = string.replace(singleCondition,strs[1]..'#','')--strs[2]
  39. local classNum = math.floor(stype / 100)
  40. local comparatorNum = stype % 100
  41. local instance
  42. local excuter = excuterMap[classNum]
  43. instance = excuter(comparatorNum,param)
  44. return instance
  45. end
  46. end
  47. function ConditionManager.Init()
  48. this.RegistExcuters()
  49. end
  50. function ConditionManager.RegistExcuters()
  51. this.RegistExcuter(1, LevelCondition)
  52. this.RegistExcuter(2, RechargeCondition)
  53. this.RegistExcuter(9, TimeCondition)
  54. this.RegistExcuter(12, VIPCondition)
  55. this.RegistExcuter(23, BagItemCondition)
  56. this.RegistExcuter(25, UnionCondition)
  57. end
  58. ---注册条件
  59. ---@param head number 条件的大类 如101除百是1
  60. ---@param class ConditionBase 对应的条件类
  61. function ConditionManager.RegistExcuter(head, class)
  62. excuterMap[head] = class
  63. class.type = head
  64. end
  65. ---对外接口 判断条件集是否满足 案例(等级大于等于1并且小于等于10 )
  66. ---@param conditionCfg string|table 具体的条件 支持#,&符号
  67. ---@return boolean
  68. function ConditionManager.Check(conditionCfg)
  69. if (type(conditionCfg) == "table") then ---样式:{{101,1},{103,10}}
  70. local singleStrs = conditionCfg
  71. local andResult = true
  72. local conditonInstance
  73. for j = 1, #singleStrs do
  74. conditonInstance = this.GenerateSingleCondition(singleStrs[j])
  75. andResult = andResult and conditonInstance:Check()
  76. if(andResult == false)then
  77. return andResult
  78. end
  79. end
  80. return andResult
  81. else ---样式:"101#1&103#10"
  82. local groupStr = string.split(conditionCfg,'/')
  83. local result = false
  84. local conditonInstance
  85. for i = 1, #groupStr do
  86. local singleStrs = string.split(groupStr[i],'&')
  87. local andResult = true
  88. for j = 1, #singleStrs do
  89. conditonInstance = this.GenerateSingleCondition(singleStrs[j])
  90. andResult = andResult and conditonInstance:Check()
  91. end
  92. result = result or andResult
  93. if(result) then
  94. break
  95. end
  96. end
  97. return result
  98. end
  99. end
  100. ---对外接口 判断条件集是否满足 案例(等级大于等于1并且小于等于10 )或者 (开服天数大于等于1并且小于等于10)
  101. ---@param conditionCfg string|table 具体的条件 支持#,&,/符号
  102. ---@return boolean
  103. function ConditionManager.Check4D(conditionCfg)
  104. if (type(conditionCfg) == "table") then ---样式:{{{101,1},{103,10}},{{901,1},{903,10}}}
  105. local groupStr = conditionCfg
  106. local result = false
  107. local conditonInstance
  108. for i = 1, #groupStr do
  109. local singleStrs = groupStr[i]
  110. local andResult = true
  111. for j = 1, #singleStrs do
  112. conditonInstance = ConditionManager.GenerateSingleCondition(singleStrs[j])
  113. andResult = andResult and conditonInstance:Check()
  114. end
  115. result = result or andResult
  116. if(result) then
  117. break
  118. end
  119. end
  120. return result
  121. else ---样式:"101#1&103#10/901#1&903#10"
  122. local groupStr = string.split(conditionCfg,'/')
  123. local result = false
  124. local conditonInstance
  125. for i = 1, #groupStr do
  126. local singleStrs = string.split(groupStr[i],'&')
  127. local andResult = true
  128. for j = 1, #singleStrs do
  129. conditonInstance = this.GenerateSingleCondition(singleStrs[j])
  130. andResult = andResult and conditonInstance:Check()
  131. end
  132. result = result or andResult
  133. if(result) then
  134. break
  135. end
  136. end
  137. return result
  138. end
  139. end
  140. ---获取条件里的参数
  141. ---"901#1&903#11" 返回{1,11}
  142. function ConditionManager.GetConditionParams(conditionStr)
  143. local params = {}
  144. for param in string.gmatch(conditionStr, "#([0-9]+)") do
  145. table.insert(params, tonumber(param))
  146. end
  147. return params
  148. end
  149. this.Init()