| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686 |
- -- 世界BOSS争夺战系统
- local this = {}
- WorldBoss = this
- -- 系统常量
- WorldBossDefine = {
- STATUS = {
- NOT_STARTED = 0, -- 未开始
- REGISTERING = 1, -- 报名中
- FIGHTING = 2, -- 战斗中
- FINISHED = 3, -- 已结束
- AUCTION = 4 -- 拍卖中
- },
-
- BOSS_TYPE = {
- CHIYAN_MO = 1, -- 炽焰魔
- ZHOUYUAN_MOWANG = 2 -- 咒怨魔王
- },
-
- ACTIVITY_CONFIG = {
- MIN_PLAYERS = 50, -- 最少报名人数
- REGISTER_DURATION = 30, -- 报名持续时间(分钟)
- FIGHT_DURATION = 60, -- 战斗持续时间(分钟)
- AUCTION_DURATION = 30, -- 拍卖持续时间(分钟)
- WEEKLY_DAY = 7, -- 每周几开启(7=周日)
- WEEKLY_HOUR = 20, -- 每周几点开启(20=晚上8点)
- WEEKLY_MINUTE = 0 -- 每周几分开启
- },
-
- DB_KEYS = {
- ACTIVITY_STATUS = "G$WorldBoss_ActivityStatus",
- CURRENT_BOSS = "G$WorldBoss_CurrentBoss",
- ACTIVITY_START_TIME = "G$WorldBoss_ActivityStartTime",
- REGISTERED_PLAYERS = "G$WorldBoss_RegisteredPlayers",
- BOSS_HP = "G$WorldBoss_BossHP",
- BOSS_MAX_HP = "G$WorldBoss_BossMaxHP",
- PLAYER_DAMAGE = "G$WorldBoss_PlayerDamage",
- ALLIANCE_DAMAGE = "G$WorldBoss_AllianceDamage",
- AUCTION_ITEMS = "G$WorldBoss_AuctionItems",
- AUCTION_START_TIME = "G$WorldBoss_AuctionStartTime",
-
- PLAYER_REGISTER_TIME = "T$WorldBoss_RegisterTime",
- PLAYER_TOTAL_DAMAGE = "T$WorldBoss_TotalDamage",
- PLAYER_REVIVE_COUNT = "T$WorldBoss_ReviveCount"
- }
- }
- -- BOSS配置
- local BOSS_CONFIG = {
- [WorldBossDefine.BOSS_TYPE.CHIYAN_MO] = {
- name = "炽焰魔",
- level = 380,
- baseHP = 100000000,
- baseDamage = 50000,
- hpMultiplier = 2.0,
- damageMultiplier = 0.5,
- dropConfig = {
- guaranteed = {
- {type = "equipment", count = 2, minAttrs = 3, maxAttrs = 4},
- {type = "set", count = 1, minAttrs = 3, maxAttrs = 4}
- },
- chance = {
- {type = "mount", itemId = "彩云兽", chance = 0.1},
- {type = "necklace", minAttrs = 2, maxAttrs = 3, chance = 0.3}
- }
- }
- },
-
- [WorldBossDefine.BOSS_TYPE.ZHOUYUAN_MOWANG] = {
- name = "咒怨魔王",
- level = 380,
- baseHP = 120000000,
- baseDamage = 60000,
- hpMultiplier = 2.5,
- damageMultiplier = 0.4,
- dropConfig = {
- guaranteed = {
- {type = "equipment", count = 2, minAttrs = 3, maxAttrs = 4},
- {type = "set", count = 2, minAttrs = 3, maxAttrs = 4}
- },
- chance = {
- {type = "mount", itemId = "1代坐骑", chance = 0.15},
- {type = "pet", itemId = "1代宠物", chance = 0.15},
- {type = "necklace", minAttrs = 2, maxAttrs = 3, chance = 0.4}
- }
- }
- }
- }
- -- 拍卖配置
- local AUCTION_CONFIG = {
- STARTING_PRICES = {
- equipment = 300,
- mount = 2000,
- pet = 2000,
- necklace = 10000,
- special = 500
- },
- COMMISSION_RATE = 0.2,
- ALLIANCE_DISTRIBUTION = {[1] = 0.5, [2] = 0.3, [3] = 0.2},
- PLAYER_DISTRIBUTION = {[1] = 0.30, [2] = 0.25, [3] = 0.20, [4] = 0.10, [5] = 0.05}
- }
- -- 初始化系统
- function this.Init()
- -- info("世界BOSS争夺战系统初始化开始")
- this.CheckAndStartActivity()
- this.StartTimers()
- -- info("世界BOSS争夺战系统初始化完成")
- end
- -- 检查并启动活动
- function this.CheckAndStartActivity()
- local now = os.time()
- local currentStatus = getsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS) or WorldBossDefine.STATUS.NOT_STARTED
-
- if currentStatus == WorldBossDefine.STATUS.NOT_STARTED and this.IsActivityTime(now) then
- this.StartActivity()
- elseif currentStatus == WorldBossDefine.STATUS.REGISTERING then
- local startTime = getsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_START_TIME) or 0
- if now - startTime >= WorldBossDefine.ACTIVITY_CONFIG.REGISTER_DURATION * 60 then
- this.StartFighting()
- end
- elseif currentStatus == WorldBossDefine.STATUS.FIGHTING then
- local startTime = getsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_START_TIME) or 0
- if now - startTime >= (WorldBossDefine.ACTIVITY_CONFIG.REGISTER_DURATION + WorldBossDefine.ACTIVITY_CONFIG.FIGHT_DURATION) * 60 then
- this.EndFighting()
- end
- elseif currentStatus == WorldBossDefine.STATUS.AUCTION then
- local auctionStartTime = getsysvar(WorldBossDefine.DB_KEYS.AUCTION_START_TIME) or 0
- if now - auctionStartTime >= WorldBossDefine.ACTIVITY_CONFIG.AUCTION_DURATION * 60 then
- this.EndAuction()
- end
- end
- end
- -- 检查是否为活动时间
- function this.IsActivityTime(now)
- local timeInfo = os.date("*t", now)
- return timeInfo.wday == WorldBossDefine.ACTIVITY_CONFIG.WEEKLY_DAY and
- timeInfo.hour == WorldBossDefine.ACTIVITY_CONFIG.WEEKLY_HOUR and
- timeInfo.min == WorldBossDefine.ACTIVITY_CONFIG.WEEKLY_MINUTE
- end
- -- 启动定时器
- function this.StartTimers()
- setTimer(60000, function()
- this.CheckAndStartActivity()
- end)
- end
- -- 开始活动
- function this.StartActivity()
- -- info("世界BOSS争夺战活动开始")
-
- local bossType = math.random(1, 2)
- local bossConfig = BOSS_CONFIG[bossType]
-
- setsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS, WorldBossDefine.STATUS.REGISTERING)
- setsysvar(WorldBossDefine.DB_KEYS.CURRENT_BOSS, bossType)
- setsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_START_TIME, os.time())
- setsysvar(WorldBossDefine.DB_KEYS.REGISTERED_PLAYERS, {})
- setsysvar(WorldBossDefine.DB_KEYS.PLAYER_DAMAGE, {})
- setsysvar(WorldBossDefine.DB_KEYS.ALLIANCE_DAMAGE, {})
-
- local bossHP = math.floor(bossConfig.baseHP * bossConfig.hpMultiplier)
- setsysvar(WorldBossDefine.DB_KEYS.BOSS_HP, bossHP)
- setsysvar(WorldBossDefine.DB_KEYS.BOSS_MAX_HP, bossHP)
-
- this.SendWorldNotice("世界BOSS争夺战开始报名!BOSS:" .. bossConfig.name .. ",报名时间30分钟,战斗时间60分钟")
- -- info("世界BOSS争夺战活动启动完成,BOSS类型:", bossType, ",血量:", bossHP)
- end
- -- 开始战斗
- function this.StartFighting()
- local registeredPlayers = getsysvar(WorldBossDefine.DB_KEYS.REGISTERED_PLAYERS) or {}
-
- if #registeredPlayers < WorldBossDefine.ACTIVITY_CONFIG.MIN_PLAYERS then
- this.CancelActivity("报名人数不足" .. WorldBossDefine.ACTIVITY_CONFIG.MIN_PLAYERS .. "人,活动取消")
- return
- end
-
- -- info("世界BOSS争夺战战斗开始,参与人数:", #registeredPlayers)
- setsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS, WorldBossDefine.STATUS.FIGHTING)
- this.SendWorldNotice("世界BOSS争夺战战斗开始!所有报名玩家可进入战场参与战斗")
- this.TeleportPlayersToBattlefield(registeredPlayers)
- end
- -- 结束战斗
- function this.EndFighting()
- -- info("世界BOSS争夺战战斗结束")
- setsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS, WorldBossDefine.STATUS.FINISHED)
- this.CalculateAllianceRanking()
- this.GenerateDropItems()
- this.StartAuction()
- end
- -- 开始拍卖
- function this.StartAuction()
- -- info("世界BOSS争夺战拍卖开始")
- setsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS, WorldBossDefine.STATUS.AUCTION)
- setsysvar(WorldBossDefine.DB_KEYS.AUCTION_START_TIME, os.time())
- this.SendWorldNotice("世界BOSS争夺战拍卖开始!拍卖时间30分钟,所有参与战斗的玩家均可参与竞拍")
- this.NotifyClientAuctionStart()
- end
- -- 结束拍卖
- function this.EndAuction()
- -- info("世界BOSS争夺战拍卖结束")
- setsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS, WorldBossDefine.STATUS.NOT_STARTED)
- this.ProcessAuctionResults()
- this.DistributeAuctionProfits()
- this.CleanupActivityData()
- this.SendWorldNotice("世界BOSS争夺战拍卖结束!收益已按规则分配")
- end
- -- 取消活动
- function this.CancelActivity(reason)
- -- info("世界BOSS争夺战活动取消,原因:", reason)
- setsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS, WorldBossDefine.STATUS.NOT_STARTED)
- this.CleanupActivityData()
- this.SendWorldNotice("世界BOSS争夺战活动取消:" .. reason)
- end
- -- 玩家报名
- function this.PlayerRegister(actor)
- local currentStatus = getsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS) or WorldBossDefine.STATUS.NOT_STARTED
-
- if currentStatus ~= WorldBossDefine.STATUS.REGISTERING then
- tipinfo(actor, "当前不在报名时间")
- return false
- end
-
- local registeredPlayers = getsysvar(WorldBossDefine.DB_KEYS.REGISTERED_PLAYERS) or {}
- local playerId = actor:toString()
-
- for _, id in ipairs(registeredPlayers) do
- if id == playerId then
- tipinfo(actor, "您已经报名了")
- return false
- end
- end
-
- table.insert(registeredPlayers, playerId)
- setsysvar(WorldBossDefine.DB_KEYS.REGISTERED_PLAYERS, registeredPlayers)
-
- setplaydef(actor, WorldBossDefine.DB_KEYS.PLAYER_REGISTER_TIME, os.time())
- setplaydef(actor, WorldBossDefine.DB_KEYS.PLAYER_TOTAL_DAMAGE, 0)
- setplaydef(actor, WorldBossDefine.DB_KEYS.PLAYER_REVIVE_COUNT, 0)
-
- tipinfo(actor, "报名成功!请等待战斗开始")
- -- info("玩家报名成功:", playerId, ",当前报名人数:", #registeredPlayers)
- return true
- end
- -- 记录玩家伤害
- function this.RecordPlayerDamage(actor, damage)
- local currentStatus = getsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS) or WorldBossDefine.STATUS.NOT_STARTED
-
- if currentStatus ~= WorldBossDefine.STATUS.FIGHTING then
- return
- end
-
- local playerId = actor:toString()
- local playerDamage = getsysvar(WorldBossDefine.DB_KEYS.PLAYER_DAMAGE) or {}
- local allianceDamage = getsysvar(WorldBossDefine.DB_KEYS.ALLIANCE_DAMAGE) or {}
-
- playerDamage[playerId] = (playerDamage[playerId] or 0) + damage
- setsysvar(WorldBossDefine.DB_KEYS.PLAYER_DAMAGE, playerDamage)
-
- local allianceId = getbaseinfo(actor, "guildid")
- if allianceId and allianceId > 0 then
- allianceDamage[allianceId] = (allianceDamage[allianceId] or 0) + damage
- setsysvar(WorldBossDefine.DB_KEYS.ALLIANCE_DAMAGE, allianceDamage)
- end
-
- setplaydef(actor, WorldBossDefine.DB_KEYS.PLAYER_TOTAL_DAMAGE, playerDamage[playerId])
- this.CheckBossDeath(damage)
- end
- -- 检查BOSS是否死亡
- function this.CheckBossDeath(damage)
- local currentHP = getsysvar(WorldBossDefine.DB_KEYS.BOSS_HP) or 0
- local newHP = math.max(0, currentHP - damage)
-
- setsysvar(WorldBossDefine.DB_KEYS.BOSS_HP, newHP)
-
- if newHP <= 0 then
- this.OnBossDeath()
- end
- end
- -- BOSS死亡处理
- function this.OnBossDeath()
- -- info("世界BOSS死亡")
- local bossType = getsysvar(WorldBossDefine.DB_KEYS.CURRENT_BOSS) or 1
- local bossConfig = BOSS_CONFIG[bossType]
- this.SendWorldNotice("世界BOSS " .. bossConfig.name .. " 已被击败!战斗结束,即将开始拍卖")
-
- setTimer(5000, function()
- this.EndFighting()
- end)
- end
- -- 计算战盟排名
- function this.CalculateAllianceRanking()
- local allianceDamage = getsysvar(WorldBossDefine.DB_KEYS.ALLIANCE_DAMAGE) or {}
-
- local allianceList = {}
- for allianceId, damage in pairs(allianceDamage) do
- table.insert(allianceList, {id = allianceId, damage = damage})
- end
-
- table.sort(allianceList, function(a, b)
- return a.damage > b.damage
- end)
-
- setsysvar(WorldBossDefine.DB_KEYS.ALLIANCE_DAMAGE, allianceList)
- -- info("战盟排名计算完成")
- end
- -- 生成掉落物品
- function this.GenerateDropItems()
- local bossType = getsysvar(WorldBossDefine.DB_KEYS.CURRENT_BOSS) or 1
- local bossConfig = BOSS_CONFIG[bossType]
- local dropItems = {}
-
- for _, dropConfig in ipairs(bossConfig.dropConfig.guaranteed) do
- for i = 1, dropConfig.count do
- local item = this.GenerateDropItem(dropConfig)
- if item then
- table.insert(dropItems, item)
- end
- end
- end
-
- for _, dropConfig in ipairs(bossConfig.dropConfig.chance) do
- if math.random() < dropConfig.chance then
- local item = this.GenerateDropItem(dropConfig)
- if item then
- table.insert(dropItems, item)
- end
- end
- end
-
- setsysvar(WorldBossDefine.DB_KEYS.AUCTION_ITEMS, dropItems)
- -- info("掉落物品生成完成,数量:", #dropItems)
- end
- -- 生成单个掉落物品
- function this.GenerateDropItem(dropConfig)
- local item = {
- id = "WB_" .. os.time() .. "_" .. math.random(1000, 9999),
- type = dropConfig.type,
- name = this.GenerateItemName(dropConfig),
- attributes = this.GenerateItemAttributes(dropConfig),
- startingPrice = AUCTION_CONFIG.STARTING_PRICES[dropConfig.type] or 300
- }
-
- return item
- end
- -- 生成物品名称
- function this.GenerateItemName(dropConfig)
- if dropConfig.type == "equipment" then
- local equipmentTypes = {"红龙", "女神", "传说", "亚特兰蒂斯", "圣魂", "红翼"}
- return equipmentTypes[math.random(1, #equipmentTypes)] .. "装备"
- elseif dropConfig.type == "set" then
- return "卓越套装"
- elseif dropConfig.type == "mount" then
- return dropConfig.itemId or "坐骑"
- elseif dropConfig.type == "pet" then
- return dropConfig.itemId or "宠物"
- elseif dropConfig.type == "necklace" then
- return "卓越项链"
- end
-
- return "未知物品"
- end
- -- 生成物品属性
- function this.GenerateItemAttributes(dropConfig)
- local attrCount = math.random(dropConfig.minAttrs or 2, dropConfig.maxAttrs or 3)
- local attributes = {}
-
- if dropConfig.type == "necklace" then
- table.insert(attributes, "卓越一击")
- attrCount = attrCount - 1
- end
-
- local allAttributes = {"攻击力", "防御力", "生命值", "魔法值", "暴击率", "闪避率", "命中率", "韧性"}
- for i = 1, attrCount do
- local attr = allAttributes[math.random(1, #allAttributes)]
- if not table.contains(attributes, attr) then
- table.insert(attributes, attr)
- end
- end
-
- return attributes
- end
- -- 处理拍卖结果
- function this.ProcessAuctionResults()
- local auctionItems = getsysvar(WorldBossDefine.DB_KEYS.AUCTION_ITEMS) or {}
-
- for _, item in ipairs(auctionItems) do
- if item.winner then
- this.ProcessSuccessfulAuction(item)
- else
- this.ProcessFailedAuction(item)
- end
- end
- end
- -- 处理成功拍卖
- function this.ProcessSuccessfulAuction(item)
- local totalPrice = item.finalPrice
- local commission = math.floor(totalPrice * AUCTION_CONFIG.COMMISSION_RATE)
- local profit = totalPrice - commission
-
- -- info("物品拍卖成功:", item.name, ",最终价格:", totalPrice, ",手续费:", commission, ",收益:", profit)
- this.DistributeItemProfit(item, profit)
- end
- -- 处理流拍物品
- function this.ProcessFailedAuction(item)
- -- info("物品流拍:", item.name)
- end
- -- 分配物品收益
- function this.DistributeItemProfit(item, profit)
- local allianceDamage = getsysvar(WorldBossDefine.DB_KEYS.ALLIANCE_DAMAGE) or {}
-
- for rank = 1, 3 do
- if allianceDamage[rank] then
- local allianceId = allianceDamage[rank].id
- local allianceShare = math.floor(profit * AUCTION_CONFIG.ALLIANCE_DISTRIBUTION[rank])
-
- if allianceShare > 0 then
- this.DistributeAllianceProfit(allianceId, allianceShare, rank)
- end
- end
- end
- end
- -- 分配战盟收益
- function this.DistributeAllianceProfit(allianceId, profit, rank)
- local playerDamage = getsysvar(WorldBossDefine.DB_KEYS.PLAYER_DAMAGE) or {}
- local alliancePlayers = {}
-
- for playerId, damage in pairs(playerDamage) do
- local playerActor = getactor(tonumber(playerId))
- if playerActor then
- local playerAllianceId = getbaseinfo(playerActor, "guildid")
- if playerAllianceId == allianceId then
- table.insert(alliancePlayers, {id = playerId, damage = damage})
- end
- end
- end
-
- table.sort(alliancePlayers, function(a, b)
- return a.damage > b.damage
- end)
-
- local remainingProfit = profit
- local distributedCount = 0
-
- for playerRank = 1, 5 do
- if alliancePlayers[playerRank] and remainingProfit > 0 then
- local playerShare = math.floor(profit * AUCTION_CONFIG.PLAYER_DISTRIBUTION[playerRank])
- if playerShare > 0 then
- this.GivePlayerProfit(alliancePlayers[playerRank].id, playerShare)
- remainingProfit = remainingProfit - playerShare
- distributedCount = distributedCount + 1
- end
- end
- end
-
- if remainingProfit > 0 and #alliancePlayers > distributedCount then
- local averageShare = math.floor(remainingProfit / (#alliancePlayers - distributedCount))
- for i = distributedCount + 1, #alliancePlayers do
- if remainingProfit > 0 then
- this.GivePlayerProfit(alliancePlayers[i].id, averageShare)
- remainingProfit = remainingProfit - averageShare
- end
- end
- end
-
- -- info("战盟收益分配完成,战盟ID:", allianceId, ",排名:", rank, ",总收益:", profit)
- end
- -- 给予玩家收益
- function this.GivePlayerProfit(playerId, amount)
- local playerActor = getactor(tonumber(playerId))
- if playerActor then
- this.SendProfitMail(playerActor, amount)
- -- info("玩家获得分红:", playerId, ",金额:", amount)
- end
- end
- -- 发送分红邮件
- function this.SendProfitMail(actor, amount)
- local mailData = {
- title = "世界BOSS拍卖分红",
- content = "恭喜您在世界BOSS争夺战中获得了拍卖分红!\n分红金额:" .. amount .. " 钻石",
- items = {},
- diamonds = amount
- }
- end
- -- 分配拍卖收益
- function this.DistributeAuctionProfits()
- -- info("拍卖收益分配完成")
- end
- -- 清理活动数据
- function this.CleanupActivityData()
- setsysvar(WorldBossDefine.DB_KEYS.CURRENT_BOSS, nil)
- setsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_START_TIME, nil)
- setsysvar(WorldBossDefine.DB_KEYS.REGISTERED_PLAYERS, nil)
- setsysvar(WorldBossDefine.DB_KEYS.BOSS_HP, nil)
- setsysvar(WorldBossDefine.DB_KEYS.BOSS_MAX_HP, nil)
- setsysvar(WorldBossDefine.DB_KEYS.PLAYER_DAMAGE, nil)
- setsysvar(WorldBossDefine.DB_KEYS.ALLIANCE_DAMAGE, nil)
- setsysvar(WorldBossDefine.DB_KEYS.AUCTION_ITEMS, nil)
- setsysvar(WorldBossDefine.DB_KEYS.AUCTION_START_TIME, nil)
-
- -- info("活动数据清理完成")
- end
- -- 传送玩家到战场
- function this.TeleportPlayersToBattlefield(players)
- -- info("传送玩家到战场,玩家数量:", #players)
- end
- -- 发送全服公告
- function this.SendWorldNotice(message)
- -- info("全服公告:", message)
- end
- -- 通知客户端拍卖开始
- function this.NotifyClientAuctionStart()
- -- info("通知客户端拍卖开始")
- end
- -- 获取活动状态
- function this.GetActivityStatus()
- return getsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_STATUS) or WorldBossDefine.STATUS.NOT_STARTED
- end
- -- 获取当前BOSS信息
- function this.GetCurrentBoss()
- local bossType = getsysvar(WorldBossDefine.DB_KEYS.CURRENT_BOSS)
- if bossType then
- return BOSS_CONFIG[bossType]
- end
- return nil
- end
- -- 获取BOSS血量信息
- function this.GetBossHPInfo()
- local currentHP = getsysvar(WorldBossDefine.DB_KEYS.BOSS_HP) or 0
- local maxHP = getsysvar(WorldBossDefine.DB_KEYS.BOSS_MAX_HP) or 0
-
- return {
- current = currentHP,
- max = maxHP,
- percentage = maxHP > 0 and (currentHP / maxHP * 100) or 0
- }
- end
- -- 获取玩家伤害排名
- function this.GetPlayerDamageRanking()
- local playerDamage = getsysvar(WorldBossDefine.DB_KEYS.PLAYER_DAMAGE) or {}
-
- local playerList = {}
- for playerId, damage in pairs(playerDamage) do
- table.insert(playerList, {id = playerId, damage = damage})
- end
-
- table.sort(playerList, function(a, b)
- return a.damage > b.damage
- end)
-
- return playerList
- end
- -- 获取战盟伤害排名
- function this.GetAllianceDamageRanking()
- return getsysvar(WorldBossDefine.DB_KEYS.ALLIANCE_DAMAGE) or {}
- end
- -- 获取拍卖物品列表
- function this.GetAuctionItems()
- return getsysvar(WorldBossDefine.DB_KEYS.AUCTION_ITEMS) or {}
- end
- -- 获取活动剩余时间
- function this.GetActivityRemainingTime()
- local currentStatus = this.GetActivityStatus()
- local startTime = getsysvar(WorldBossDefine.DB_KEYS.ACTIVITY_START_TIME) or 0
- local now = os.time()
-
- if currentStatus == WorldBossDefine.STATUS.REGISTERING then
- return math.max(0, WorldBossDefine.ACTIVITY_CONFIG.REGISTER_DURATION * 60 - (now - startTime))
- elseif currentStatus == WorldBossDefine.STATUS.FIGHTING then
- return math.max(0, (WorldBossDefine.ACTIVITY_CONFIG.REGISTER_DURATION + WorldBossDefine.ACTIVITY_CONFIG.FIGHT_DURATION) * 60 - (now - startTime))
- elseif currentStatus == WorldBossDefine.STATUS.AUCTION then
- local auctionStartTime = getsysvar(WorldBossDefine.DB_KEYS.AUCTION_START_TIME) or 0
- return math.max(0, WorldBossDefine.ACTIVITY_CONFIG.AUCTION_DURATION * 60 - (now - auctionStartTime))
- end
-
- return 0
- end
- -- 玩家复活
- function this.PlayerRevive(actor, useDiamond)
- local currentStatus = this.GetActivityStatus()
-
- if currentStatus ~= WorldBossDefine.STATUS.FIGHTING then
- tipinfo(actor, "当前不在战斗时间")
- return false
- end
-
- if useDiamond then
- local diamondCount = getitemcount(actor, "diamond")
- if diamondCount < 100 then
- tipinfo(actor, "钻石不足,无法复活")
- return false
- end
-
- removeitemfrombag(actor, "diamond", 100, 0, 9999, '世界BOSS复活')
- this.RevivePlayerAtPosition(actor)
- else
- this.RevivePlayerAtSafeZone(actor)
- end
-
- local reviveCount = getplaydef(actor, WorldBossDefine.DB_KEYS.PLAYER_REVIVE_COUNT) or 0
- setplaydef(actor, WorldBossDefine.DB_KEYS.PLAYER_REVIVE_COUNT, reviveCount + 1)
-
- return true
- end
- -- 原地复活玩家
- function this.RevivePlayerAtPosition(actor)
- tipinfo(actor, "原地复活成功!")
- end
- -- 安全区复活玩家
- function this.RevivePlayerAtSafeZone(actor)
- tipinfo(actor, "已回到安全区复活")
- end
- -- 检查玩家是否已报名
- function this.IsPlayerRegistered(actor)
- local registeredPlayers = getsysvar(WorldBossDefine.DB_KEYS.REGISTERED_PLAYERS) or {}
- local playerId = actor:toString()
-
- for _, id in ipairs(registeredPlayers) do
- if id == playerId then
- return true
- end
- end
-
- return false
- end
- -- 检查玩家是否可参与活动
- function this.CanPlayerParticipate(actor)
- local currentStatus = this.GetActivityStatus()
-
- if currentStatus == WorldBossDefine.STATUS.NOT_STARTED then
- return false, "活动未开始"
- elseif currentStatus == WorldBossDefine.STATUS.REGISTERING then
- return this.IsPlayerRegistered(actor), "请先报名参加活动"
- elseif currentStatus == WorldBossDefine.STATUS.FIGHTING then
- return this.IsPlayerRegistered(actor), "请先报名参加活动"
- elseif currentStatus == WorldBossDefine.STATUS.AUCTION then
- return this.IsPlayerRegistered(actor), "请先报名参加活动"
- end
-
- return false, "活动状态异常"
- end
- return this
|