SiegeWar.lua 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. -- 攻城战系统
  2. local this = {}
  3. SiegeWar = this
  4. -- 系统常量
  5. SiegeWarDefine = {
  6. STATUS = {
  7. NOT_STARTED = 0, -- 未开始
  8. PREPARING = 1, -- 准备中
  9. FIGHTING = 2, -- 战斗中
  10. FINISHED = 3 -- 已结束
  11. },
  12. PHASE = {
  13. PREPARE = 1, -- 准备阶段
  14. ATTACK = 2, -- 攻击阶段
  15. DEFEND = 3, -- 防守阶段
  16. SETTLEMENT = 4 -- 结算阶段
  17. },
  18. ACTIVITY_CONFIG = {
  19. OPEN_DAYS = 14, -- 开服后多少天开启
  20. DURATION = 120, -- 活动持续时间(分钟)
  21. PREPARE_TIME = 30, -- 准备时间(分钟)
  22. ATTACK_TIME = 60, -- 攻击时间(分钟)
  23. DEFEND_TIME = 30 -- 防守时间(分钟)
  24. },
  25. DB_KEYS = {
  26. ACTIVITY_STATUS = "G$SiegeWar_ActivityStatus",
  27. CURRENT_PHASE = "G$SiegeWar_CurrentPhase",
  28. ACTIVITY_START_TIME = "G$SiegeWar_ActivityStartTime",
  29. PHASE_START_TIME = "G$SiegeWar_PhaseStartTime",
  30. PARTICIPATING_ALLIANCES = "G$SiegeWar_ParticipatingAlliances",
  31. CASTLE_HP = "G$SiegeWar_CastleHP",
  32. CASTLE_MAX_HP = "G$SiegeWar_CastleMaxHP",
  33. ALLIANCE_SCORES = "G$SiegeWar_AllianceScores",
  34. PLAYER_SCORES = "G$SiegeWar_PlayerScores",
  35. CASTLE_OWNER = "G$SiegeWar_CastleOwner",
  36. WINNER_ALLIANCE = "G$SiegeWar_WinnerAlliance"
  37. }
  38. }
  39. -- 城堡配置
  40. local CASTLE_CONFIG = {
  41. MAX_HP = 1000000, -- 城堡最大血量
  42. DEFENSE_BONUS = 1.5, -- 防守方伤害加成
  43. ATTACK_BONUS = 1.2, -- 攻击方伤害加成
  44. CAPTURE_THRESHOLD = 0.1, -- 占领阈值(剩余血量百分比)
  45. REWARD_MULTIPLIER = 2.0 -- 奖励倍数
  46. }
  47. -- 初始化系统
  48. function this.Init()
  49. -- info("攻城战系统初始化开始")
  50. -- 检查服务器开启天数
  51. this.CheckServerOpenDays()
  52. -- 启动定时器
  53. this.StartTimers()
  54. -- info("攻城战系统初始化完成")
  55. end
  56. -- 检查服务器开启天数
  57. function this.CheckServerOpenDays()
  58. local serverOpenDays = getbaseinfo(nil, "serveropendays") or 0
  59. if serverOpenDays >= SiegeWarDefine.ACTIVITY_CONFIG.OPEN_DAYS then
  60. -- 服务器开启天数满足要求,可以开启攻城战
  61. this.EnableSiegeWar()
  62. else
  63. -- info("服务器开启天数不足,攻城战暂未开启。当前天数:", serverOpenDays, ",需要天数:", SiegeWarDefine.ACTIVITY_CONFIG.OPEN_DAYS)
  64. end
  65. end
  66. -- 启用攻城战
  67. function this.EnableSiegeWar()
  68. -- info("攻城战系统已启用")
  69. -- 这里可以设置一些标志位或通知客户端
  70. end
  71. -- 启动定时器
  72. function this.StartTimers()
  73. -- 每分钟检查一次活动状态
  74. setTimer(60000, function()
  75. this.CheckAndStartActivity()
  76. end)
  77. end
  78. -- 检查并启动活动
  79. function this.CheckAndStartActivity()
  80. local now = os.time()
  81. local currentStatus = getsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_STATUS) or SiegeWarDefine.STATUS.NOT_STARTED
  82. if currentStatus == SiegeWarDefine.STATUS.NOT_STARTED then
  83. -- 检查是否到了活动时间
  84. if this.IsActivityTime(now) then
  85. this.StartActivity()
  86. end
  87. elseif currentStatus == SiegeWarDefine.STATUS.PREPARING then
  88. -- 检查准备阶段是否结束
  89. local startTime = getsysvar(SiegeWarDefine.DB_KEYS.PHASE_START_TIME) or 0
  90. if now - startTime >= SiegeWarDefine.ACTIVITY_CONFIG.PREPARE_TIME * 60 then
  91. this.StartAttackPhase()
  92. end
  93. elseif currentStatus == SiegeWarDefine.STATUS.FIGHTING then
  94. -- 检查攻击阶段是否结束
  95. local startTime = getsysvar(SiegeWarDefine.DB_KEYS.PHASE_START_TIME) or 0
  96. if now - startTime >= SiegeWarDefine.ACTIVITY_CONFIG.ATTACK_TIME * 60 then
  97. this.StartDefendPhase()
  98. end
  99. end
  100. end
  101. -- 检查是否为活动时间
  102. function this.IsActivityTime(now)
  103. -- 这里可以根据具体需求设置活动时间
  104. -- 例如:每周六晚上8点
  105. local timeInfo = os.date("*t", now)
  106. return timeInfo.wday == 6 and timeInfo.hour == 20 and timeInfo.min == 0
  107. end
  108. -- 开始活动
  109. function this.StartActivity()
  110. -- info("攻城战活动开始")
  111. -- 设置活动状态
  112. setsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_STATUS, SiegeWarDefine.STATUS.PREPARING)
  113. setsysvar(SiegeWarDefine.DB_KEYS.CURRENT_PHASE, SiegeWarDefine.PHASE.PREPARE)
  114. setsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_START_TIME, os.time())
  115. setsysvar(SiegeWarDefine.DB_KEYS.PHASE_START_TIME, os.time())
  116. setsysvar(SiegeWarDefine.DB_KEYS.PARTICIPATING_ALLIANCES, {})
  117. setsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES, {})
  118. setsysvar(SiegeWarDefine.DB_KEYS.PLAYER_SCORES, {})
  119. -- 设置城堡血量
  120. setsysvar(SiegeWarDefine.DB_KEYS.CASTLE_HP, CASTLE_CONFIG.MAX_HP)
  121. setsysvar(SiegeWarDefine.DB_KEYS.CASTLE_MAX_HP, CASTLE_CONFIG.MAX_HP)
  122. -- 获取当前城堡拥有者
  123. local castleOwner = this.GetCastleOwner()
  124. if castleOwner then
  125. setsysvar(SiegeWarDefine.DB_KEYS.CASTLE_OWNER, castleOwner)
  126. end
  127. -- 发送全服公告
  128. this.SendWorldNotice("攻城战活动开始!准备阶段30分钟,所有战盟可报名参与")
  129. -- info("攻城战活动启动完成")
  130. end
  131. -- 开始攻击阶段
  132. function this.StartAttackPhase()
  133. -- info("攻城战攻击阶段开始")
  134. setsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_STATUS, SiegeWarDefine.STATUS.FIGHTING)
  135. setsysvar(SiegeWarDefine.DB_KEYS.CURRENT_PHASE, SiegeWarDefine.PHASE.ATTACK)
  136. setsysvar(SiegeWarDefine.DB_KEYS.PHASE_START_TIME, os.time())
  137. this.SendWorldNotice("攻城战攻击阶段开始!攻击时间60分钟,所有报名战盟可攻击城堡")
  138. end
  139. -- 开始防守阶段
  140. function this.StartDefendPhase()
  141. -- info("攻城战防守阶段开始")
  142. setsysvar(SiegeWarDefine.DB_KEYS.CURRENT_PHASE, SiegeWarDefine.PHASE.DEFEND)
  143. setsysvar(SiegeWarDefine.DB_KEYS.PHASE_START_TIME, os.time())
  144. this.SendWorldNotice("攻城战防守阶段开始!防守时间30分钟,城堡拥有者战盟可防守城堡")
  145. -- 延迟结束活动
  146. setTimer(SiegeWarDefine.ACTIVITY_CONFIG.DEFEND_TIME * 60 * 1000, function()
  147. this.EndActivity()
  148. end)
  149. end
  150. -- 结束活动
  151. function this.EndActivity()
  152. -- info("攻城战活动结束")
  153. setsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_STATUS, SiegeWarDefine.STATUS.FINISHED)
  154. -- 计算最终结果
  155. this.CalculateFinalResult()
  156. -- 分配奖励
  157. this.DistributeRewards()
  158. -- 清理数据
  159. this.CleanupActivityData()
  160. this.SendWorldNotice("攻城战活动结束!结果已公布,奖励已分配")
  161. end
  162. -- 战盟报名
  163. function this.AllianceRegister(actor)
  164. local currentStatus = getsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_STATUS) or SiegeWarDefine.STATUS.NOT_STARTED
  165. if currentStatus ~= SiegeWarDefine.STATUS.PREPARING then
  166. tipinfo(actor, "当前不在报名时间")
  167. return false
  168. end
  169. local allianceId = getbaseinfo(actor, "guildid")
  170. if not allianceId or allianceId <= 0 then
  171. tipinfo(actor, "您不是战盟成员")
  172. return false
  173. end
  174. local participatingAlliances = getsysvar(SiegeWarDefine.DB_KEYS.PARTICIPATING_ALLIANCES) or {}
  175. -- 检查是否已报名
  176. for _, id in ipairs(participatingAlliances) do
  177. if id == allianceId then
  178. tipinfo(actor, "您的战盟已经报名了")
  179. return false
  180. end
  181. end
  182. -- 添加战盟到报名列表
  183. table.insert(participatingAlliances, allianceId)
  184. setsysvar(SiegeWarDefine.DB_KEYS.PARTICIPATING_ALLIANCES, participatingAlliances)
  185. -- 初始化战盟分数
  186. local allianceScores = getsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES) or {}
  187. allianceScores[allianceId] = 0
  188. setsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES, allianceScores)
  189. tipinfo(actor, "战盟报名成功!请等待战斗开始")
  190. -- info("战盟报名成功:", allianceId, ",当前报名战盟数:", #participatingAlliances)
  191. return true
  192. end
  193. -- 记录玩家伤害
  194. function this.RecordPlayerDamage(actor, damage, isDefender)
  195. local currentStatus = getsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_STATUS) or SiegeWarDefine.STATUS.NOT_STARTED
  196. if currentStatus ~= SiegeWarDefine.STATUS.FIGHTING then
  197. return
  198. end
  199. local playerId = actor:toString()
  200. local allianceId = getbaseinfo(actor, "guildid")
  201. if not allianceId or allianceId <= 0 then
  202. return
  203. end
  204. -- 检查战盟是否已报名
  205. local participatingAlliances = getsysvar(SiegeWarDefine.DB_KEYS.PARTICIPATING_ALLIANCES) or {}
  206. local isParticipating = false
  207. for _, id in ipairs(participatingAlliances) do
  208. if id == allianceId then
  209. isParticipating = true
  210. break
  211. end
  212. end
  213. if not isParticipating then
  214. return
  215. end
  216. -- 应用伤害加成
  217. local finalDamage = damage
  218. if isDefender then
  219. finalDamage = math.floor(damage * CASTLE_CONFIG.DEFENSE_BONUS)
  220. else
  221. finalDamage = math.floor(damage * CASTLE_CONFIG.ATTACK_BONUS)
  222. end
  223. -- 更新城堡血量
  224. this.UpdateCastleHP(finalDamage, isDefender)
  225. -- 更新玩家分数
  226. this.UpdatePlayerScore(actor, finalDamage)
  227. -- 更新战盟分数
  228. this.UpdateAllianceScore(allianceId, finalDamage)
  229. -- 检查城堡是否被攻破
  230. this.CheckCastleCapture()
  231. end
  232. -- 更新城堡血量
  233. function this.UpdateCastleHP(damage, isDefender)
  234. local currentHP = getsysvar(SiegeWarDefine.DB_KEYS.CASTLE_HP) or CASTLE_CONFIG.MAX_HP
  235. local maxHP = getsysvar(SiegeWarDefine.DB_KEYS.CASTLE_MAX_HP) or CASTLE_CONFIG.MAX_HP
  236. if isDefender then
  237. -- 防守方攻击,恢复城堡血量
  238. currentHP = math.min(maxHP, currentHP + damage)
  239. else
  240. -- 攻击方攻击,减少城堡血量
  241. currentHP = math.max(0, currentHP - damage)
  242. end
  243. setsysvar(SiegeWarDefine.DB_KEYS.CASTLE_HP, currentHP)
  244. -- info("城堡血量更新:", currentHP, "/", maxHP, ",伤害:", damage, ",是否防守方:", isDefender)
  245. end
  246. -- 更新玩家分数
  247. function this.UpdatePlayerScore(actor, damage)
  248. local playerScores = getsysvar(SiegeWarDefine.DB_KEYS.PLAYER_SCORES) or {}
  249. local playerId = actor:toString()
  250. playerScores[playerId] = (playerScores[playerId] or 0) + damage
  251. setsysvar(SiegeWarDefine.DB_KEYS.PLAYER_SCORES, playerScores)
  252. end
  253. -- 更新战盟分数
  254. function this.UpdateAllianceScore(allianceId, damage)
  255. local allianceScores = getsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES) or {}
  256. allianceScores[allianceId] = (allianceScores[allianceId] or 0) + damage
  257. setsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES, allianceScores)
  258. end
  259. -- 检查城堡是否被攻破
  260. function this.CheckCastleCapture()
  261. local currentHP = getsysvar(SiegeWarDefine.DB_KEYS.CASTLE_HP) or CASTLE_CONFIG.MAX_HP
  262. local maxHP = getsysvar(SiegeWarDefine.DB_KEYS.CASTLE_MAX_HP) or CASTLE_CONFIG.MAX_HP
  263. if currentHP <= maxHP * CASTLE_CONFIG.CAPTURE_THRESHOLD then
  264. -- 城堡被攻破
  265. this.OnCastleCaptured()
  266. end
  267. end
  268. -- 城堡被攻破
  269. function this.OnCastleCaptured()
  270. -- info("城堡被攻破")
  271. -- 找到伤害最高的攻击方战盟
  272. local allianceScores = getsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES) or {}
  273. local castleOwner = getsysvar(SiegeWarDefine.DB_KEYS.CASTLE_OWNER)
  274. local maxScore = 0
  275. local winnerAlliance = nil
  276. for allianceId, score in pairs(allianceScores) do
  277. if allianceId ~= castleOwner and score > maxScore then
  278. maxScore = score
  279. winnerAlliance = allianceId
  280. end
  281. end
  282. if winnerAlliance then
  283. -- 设置新的城堡拥有者
  284. setsysvar(SiegeWarDefine.DB_KEYS.CASTLE_OWNER, winnerAlliance)
  285. setsysvar(SiegeWarDefine.DB_KEYS.WINNER_ALLIANCE, winnerAlliance)
  286. this.SendWorldNotice("城堡已被攻破!新的城堡拥有者:" .. this.GetAllianceName(winnerAlliance))
  287. -- 恢复城堡血量
  288. setsysvar(SiegeWarDefine.DB_KEYS.CASTLE_HP, CASTLE_CONFIG.MAX_HP)
  289. end
  290. end
  291. -- 计算最终结果
  292. function this.CalculateFinalResult()
  293. local castleOwner = getsysvar(SiegeWarDefine.DB_KEYS.CASTLE_OWNER)
  294. local allianceScores = getsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES) or {}
  295. if castleOwner then
  296. -- 城堡拥有者获胜
  297. setsysvar(SiegeWarDefine.DB_KEYS.WINNER_ALLIANCE, castleOwner)
  298. -- info("攻城战结果:城堡拥有者获胜,战盟ID:", castleOwner)
  299. else
  300. -- 没有城堡拥有者,按分数排名
  301. local allianceList = {}
  302. for allianceId, score in pairs(allianceScores) do
  303. table.insert(allianceList, {id = allianceId, score = score})
  304. end
  305. table.sort(allianceList, function(a, b)
  306. return a.score > b.score
  307. end)
  308. if #allianceList > 0 then
  309. setsysvar(SiegeWarDefine.DB_KEYS.WINNER_ALLIANCE, allianceList[1].id)
  310. -- info("攻城战结果:按分数排名获胜,战盟ID:", allianceList[1].id, ",分数:", allianceList[1].score)
  311. end
  312. end
  313. end
  314. -- 分配奖励
  315. function this.DistributeRewards()
  316. local winnerAlliance = getsysvar(SiegeWarDefine.DB_KEYS.WINNER_ALLIANCE)
  317. local allianceScores = getsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES) or {}
  318. if winnerAlliance then
  319. -- 给获胜战盟发放奖励
  320. this.GiveAllianceReward(winnerAlliance, true)
  321. -- 给其他参与战盟发放参与奖励
  322. for allianceId, score in pairs(allianceScores) do
  323. if allianceId ~= winnerAlliance and score > 0 then
  324. this.GiveAllianceReward(allianceId, false)
  325. end
  326. end
  327. end
  328. -- info("攻城战奖励分配完成")
  329. end
  330. -- 给战盟发放奖励
  331. function this.GiveAllianceReward(allianceId, isWinner)
  332. local rewardMultiplier = isWinner and CASTLE_CONFIG.REWARD_MULTIPLIER or 1.0
  333. local baseReward = 1000 -- 基础奖励
  334. local finalReward = math.floor(baseReward * rewardMultiplier)
  335. -- 这里需要实现具体的奖励发放逻辑
  336. -- 可以给战盟成员发放邮件奖励
  337. -- info("战盟奖励:", allianceId, ",是否获胜:", isWinner, ",奖励:", finalReward)
  338. end
  339. -- 清理活动数据
  340. function this.CleanupActivityData()
  341. setsysvar(SiegeWarDefine.DB_KEYS.CURRENT_PHASE, nil)
  342. setsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_START_TIME, nil)
  343. setsysvar(SiegeWarDefine.DB_KEYS.PHASE_START_TIME, nil)
  344. setsysvar(SiegeWarDefine.DB_KEYS.PARTICIPATING_ALLIANCES, nil)
  345. setsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES, nil)
  346. setsysvar(SiegeWarDefine.DB_KEYS.PLAYER_SCORES, nil)
  347. -- info("攻城战活动数据清理完成")
  348. end
  349. -- 获取城堡拥有者
  350. function this.GetCastleOwner()
  351. -- 这里需要实现获取城堡拥有者的逻辑
  352. -- 可以从配置文件或数据库读取
  353. return nil
  354. end
  355. -- 获取战盟名称
  356. function this.GetAllianceName(allianceId)
  357. -- 这里需要实现获取战盟名称的逻辑
  358. return "战盟" .. allianceId
  359. end
  360. -- 发送全服公告
  361. function this.SendWorldNotice(message)
  362. -- info("全服公告:", message)
  363. end
  364. -- 获取活动状态
  365. function this.GetActivityStatus()
  366. return getsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_STATUS) or SiegeWarDefine.STATUS.NOT_STARTED
  367. end
  368. -- 获取当前阶段
  369. function this.GetCurrentPhase()
  370. return getsysvar(SiegeWarDefine.DB_KEYS.CURRENT_PHASE) or SiegeWarDefine.PHASE.PREPARE
  371. end
  372. -- 获取城堡血量信息
  373. function this.GetCastleHPInfo()
  374. local currentHP = getsysvar(SiegeWarDefine.DB_KEYS.CASTLE_HP) or CASTLE_CONFIG.MAX_HP
  375. local maxHP = getsysvar(SiegeWarDefine.DB_KEYS.CASTLE_MAX_HP) or CASTLE_CONFIG.MAX_HP
  376. return {
  377. current = currentHP,
  378. max = maxHP,
  379. percentage = maxHP > 0 and (currentHP / maxHP * 100) or 0
  380. }
  381. end
  382. -- 获取战盟分数排名
  383. function this.GetAllianceScoreRanking()
  384. local allianceScores = getsysvar(SiegeWarDefine.DB_KEYS.ALLIANCE_SCORES) or {}
  385. local allianceList = {}
  386. for allianceId, score in pairs(allianceScores) do
  387. table.insert(allianceList, {id = allianceId, score = score})
  388. end
  389. table.sort(allianceList, function(a, b)
  390. return a.score > b.score
  391. end)
  392. return allianceList
  393. end
  394. -- 获取玩家分数排名
  395. function this.GetPlayerScoreRanking()
  396. local playerScores = getsysvar(SiegeWarDefine.DB_KEYS.PLAYER_SCORES) or {}
  397. local playerList = {}
  398. for playerId, score in pairs(playerScores) do
  399. table.insert(playerList, {id = playerId, score = score})
  400. end
  401. table.sort(playerList, function(a, b)
  402. return a.score > b.score
  403. end)
  404. return playerList
  405. end
  406. -- 获取活动剩余时间
  407. function this.GetActivityRemainingTime()
  408. local currentStatus = this.GetActivityStatus()
  409. local startTime = getsysvar(SiegeWarDefine.DB_KEYS.ACTIVITY_START_TIME) or 0
  410. local now = os.time()
  411. if currentStatus == SiegeWarDefine.STATUS.PREPARING then
  412. return math.max(0, SiegeWarDefine.ACTIVITY_CONFIG.PREPARE_TIME * 60 - (now - startTime))
  413. elseif currentStatus == SiegeWarDefine.STATUS.FIGHTING then
  414. local phaseStartTime = getsysvar(SiegeWarDefine.DB_KEYS.PHASE_START_TIME) or 0
  415. local currentPhase = this.GetCurrentPhase()
  416. if currentPhase == SiegeWarDefine.PHASE.ATTACK then
  417. return math.max(0, SiegeWarDefine.ACTIVITY_CONFIG.ATTACK_TIME * 60 - (now - phaseStartTime))
  418. elseif currentPhase == SiegeWarDefine.PHASE.DEFEND then
  419. return math.max(0, SiegeWarDefine.ACTIVITY_CONFIG.DEFEND_TIME * 60 - (now - phaseStartTime))
  420. end
  421. end
  422. return 0
  423. end
  424. -- 检查战盟是否已报名
  425. function this.IsAllianceRegistered(actor)
  426. local allianceId = getbaseinfo(actor, "guildid")
  427. if not allianceId or allianceId <= 0 then
  428. return false
  429. end
  430. local participatingAlliances = getsysvar(SiegeWarDefine.DB_KEYS.PARTICIPATING_ALLIANCES) or {}
  431. for _, id in ipairs(participatingAlliances) do
  432. if id == allianceId then
  433. return true
  434. end
  435. end
  436. return false
  437. end
  438. -- 检查玩家是否可参与活动
  439. function this.CanPlayerParticipate(actor)
  440. local currentStatus = this.GetActivityStatus()
  441. if currentStatus == SiegeWarDefine.STATUS.NOT_STARTED then
  442. return false, "活动未开始"
  443. elseif currentStatus == SiegeWarDefine.STATUS.PREPARING then
  444. return this.IsAllianceRegistered(actor), "请先报名参加活动"
  445. elseif currentStatus == SiegeWarDefine.STATUS.FIGHTING then
  446. return this.IsAllianceRegistered(actor), "请先报名参加活动"
  447. end
  448. return false, "活动状态异常"
  449. end
  450. return this