帮我写一套PK乱斗活动代码+PK活动专属地图,要求死亡不掉经验,不掉武勋,每杀1人可获得1点积分,活动持续时间20分钟,积分最高的前10名每人获得1个强化石
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-05-27 14:41:54 |
👁️ 阅读: 0
以下是一套PK乱斗活动的完整代码实现,包含活动地图配置、积分规则、奖励发放等功能:
## 1. 活动地图配置(MapInfo表)
```lua
-- PK乱斗活动地图配置
MapID = 9999 -- 活动专属地图ID
MapName = "PK乱斗竞技场"
MapType = 0 -- 普通地图
SafeZone = 0 -- 非安全区
PKDropExp = 0 -- PK不掉经验
PKDropItem = 0 -- PK不掉装备
ReviveMap = 9999 -- 原地复活
```
## 2. 活动触发脚本(timerevent.lua)
```lua
-- PK乱斗活动定时开启
function timerevent()
-- 每天20:00开启活动
if os.date("%H:%M") == "20:00" then
-- 广播活动开启
sendmsgnew(nil, 255, 255, "PK乱斗活动已开启!持续20分钟,死亡不掉经验不掉武勋,击杀获得积分!", 1, 5)
-- 创建活动实例
local activity = {
startTime = os.time(),
duration = 20 * 60, -- 20分钟
players = {}, -- 玩家积分表 {actorID = score}
ranking = {} -- 排行榜
}
-- 存储活动数据
setglobalvar("PK_BATTLE_ACTIVITY", activity)
-- 开启活动倒计时
settimer(activity.duration * 1000, "end_pk_battle")
end
end
-- 活动结束处理
function end_pk_battle()
local activity = getglobalvar("PK_BATTLE_ACTIVITY")
if not activity then return end
-- 计算排行榜
local ranking = {}
for actorID, score in pairs(activity.players) do
table.insert(ranking, {actorID = actorID, score = score})
end
-- 按积分排序
table.sort(ranking, function(a, b)
return a.score > b.score
end)
-- 发放前10名奖励
for i = 1, math.min(10, #ranking) do
local actor = getactor(ranking[i].actorID)
if actor then
-- 发放强化石
giveitem(actor, 10001, 1) -- 10001为强化石道具ID
sendmsg(actor, 6, string.format("恭喜你在PK乱斗中获得第%d名,获得强化石×1!", i))
end
end
-- 广播活动结束
sendmsgnew(nil, 255, 255, "PK乱斗活动已结束!积分前10名已获得强化石奖励!", 1, 5)
-- 清空活动数据
setglobalvar("PK_BATTLE_ACTIVITY", nil)
-- 将所有玩家传送回原地图
for actorID, _ in pairs(activity.players) do
local actor = getactor(actorID)
if actor then
local oldMap = getvalue(actor, "OLDMAP")
if oldMap then
changemap(actor, oldMap, 0, 0)
end
end
end
end
```
## 3. 玩家进入活动地图(mapEvent.lua)
```lua
-- 玩家进入PK乱斗地图
function mapEvent(actor, mapID)
if mapID == 9999 then -- PK乱斗地图
-- 记录玩家原地图
local oldMap = getmap(actor)
setrefdata(actor, 0, oldMap) -- 使用自定义数据存储原地图
-- 初始化玩家积分
local activity = getglobalvar("PK_BATTLE_ACTIVITY")
if activity then
activity.players[getactorid(actor)] = 0
end
-- 提示活动规则
sendmsg(actor, 6, "PK乱斗活动规则:")
sendmsg(actor, 6, "1. 死亡不掉经验、不掉武勋")
sendmsg(actor, 6, "2. 每击杀1人获得1积分")
sendmsg(actor, 6, "3. 活动持续20分钟")
sendmsg(actor, 6, "4. 积分前10名每人获得1个强化石")
end
end
```
## 4. PK击杀处理(killplayerevent.lua)
```lua
-- 玩家击杀其他玩家
function killplayerevent(killer, victim)
local mapID = getmap(killer)
-- 检查是否在PK乱斗地图
if mapID == 9999 then
local activity = getglobalvar("PK_BATTLE_ACTIVITY")
if activity then
-- 增加击杀者积分
local killerID = getactorid(killer)
activity.players[killerID] = (activity.players[killerID] or 0) + 1
-- 提示积分
local currentScore = activity.players[killerID]
sendmsg(killer, 6, string.format("击杀成功!当前积分:%d", currentScore))
-- 死亡保护:不掉经验不掉武勋
setvalue(victim, "NOGETEXP", 1) -- 设置不掉经验
-- 武勋保护通过不触发武勋减少逻辑实现
end
end
end
```
## 5. 玩家死亡处理(dieevent.lua)
```lua
-- 玩家死亡事件
function die(actor, killer)
local mapID = getmap(actor)
-- 在PK乱斗地图中死亡
if mapID == 9999 then
-- 原地复活
revive(actor, 100, 100) -- 恢复100%血蓝
-- 提示死亡
if killer and getactortype(killer) == 0 then -- 被玩家击杀
sendmsg(actor, 6, "你被击败了!将在原地复活,不掉经验不掉武勋")
end
return true -- 阻止默认死亡处理
end
end
```
## 6. 活动查询命令(cmd.lua)
```lua
-- 查询PK乱斗积分
function cmd_pk_score(actor)
local activity = getglobalvar("PK_BATTLE_ACTIVITY")
if not activity then
sendmsg(actor, 6, "当前没有进行中的PK乱斗活动")
return
end
local actorID = getactorid(actor)
local score = activity.players[actorID] or 0
-- 显示个人积分
sendmsg(actor, 6, string.format("你的当前积分:%d", score))
-- 显示剩余时间
local elapsed = os.time() - activity.startTime
local remaining = activity.duration - elapsed
if remaining > 0 then
local minutes = math.floor(remaining / 60)
local seconds = remaining % 60
sendmsg(actor, 6, string.format("活动剩余时间:%02d:%02d", minutes, seconds))
end
end
-- 注册命令
addcmd("积分", "cmd_pk_score", 0)
```
## 7. 活动传送NPC(npc.lua)
```lua
-- PK乱斗活动传送员
function npc_pk_warrior(actor, npc)
local activity = getglobalvar("PK_BATTLE_ACTIVITY")
if activity then
-- 检查活动是否在进行中
local elapsed = os.time() - activity.startTime
if elapsed < activity.duration then
-- 传送至活动地图
changemap(actor, 9999, 50, 50)
sendmsg(actor, 6, "已传送至PK乱斗竞技场!")
else
sendmsg(actor, 6, "活动已结束,请等待下次开启")
end
else
sendmsg(actor, 6, "PK乱斗活动暂未开启,开启时间:每天20:00")
end
end
```
## 8. 武勋保护配置
在武勋系统的经验计算逻辑中,需要添加PK乱斗地图的判定:
```lua
-- 在武勋经验计算函数中添加
if getmap(actor) == 9999 then
-- PK乱斗地图中死亡不掉武勋
return 0
end
```
这套代码实现了完整的PK乱斗活动系统,包含:
1. 定时开启的20分钟活动
2. 专属的PK竞技场地图
3. 死亡不掉经验、不掉武勋的保护机制
4. 击杀积分系统
5. 实时排行榜
6. 活动结束后的奖励发放
7. 玩家查询和传送功能
活动通过GameData表配置相关参数,如活动时间、奖励道具ID等,确保系统的可配置性和扩展性。
← 返回问答库