帮我写一套PK乱斗活动代码+PK活动专属地图,要求死亡不掉经验,不掉武勋,每杀1人可获得1点积分,活动持续时间20分钟,积分最高的第一名获得5个强化石,第二名活动4个强化石,第三名获得3个强化石,第4名到第十名活动2个强化石,第11名到第一百米玩家获得1个强化石,文件都需要保存到哪个文件夹里面详细告诉我操作流程
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-05-27 15:08:18 |
👁️ 阅读: 0
要创建PK乱斗活动,需要配置活动地图、怪物、掉落表,并编写服务端脚本。以下是完整的实现步骤和文件保存位置:
## 一、服务端脚本文件
### 1. 活动主控脚本
**文件位置**:`服务端/scripts/活动/PK乱斗活动.lua`
```lua
-- PK乱斗活动主控脚本
local PKBattleActivity = {}
-- 活动配置
local ACTIVITY_CONFIG = {
MAP_ID = 9999, -- 活动地图ID(自定义)
DURATION = 20 * 60, -- 20分钟(秒)
KILL_SCORE = 1, -- 每杀1人获得积分
NO_EXP_LOSS = true, -- 死亡不掉经验
NO_WUXUN_LOSS = true, -- 死亡不掉武勋
REWARDS = {
[1] = {item_id = 1001, count = 5}, -- 第1名:5个强化石(假设强化石ID=1001)
[2] = {item_id = 1001, count = 4}, -- 第2名:4个
[3] = {item_id = 1001, count = 3}, -- 第3名:3个
[4] = {item_id = 1001, count = 2}, -- 第4-10名:2个
[11] = {item_id = 1001, count = 1} -- 第11-100名:1个
}
}
local playerScores = {} -- 玩家积分表 {玩家ID = 积分}
local activityStartTime = 0 -- 活动开始时间
local isActivityRunning = false
-- 活动开始
function PKBattleActivity:StartActivity()
if isActivityRunning then
return
end
isActivityRunning = true
activityStartTime = os.time()
playerScores = {}
-- 广播活动开始
sendmsgnew(nil, 255, 255, "PK乱斗活动开始!持续20分钟,死亡不掉经验武勋,杀敌获得积分!", 1, 5)
-- 设置定时器,20分钟后结束
settimer("EndPKBattleActivity", ACTIVITY_CONFIG.DURATION * 1000)
end
-- 玩家进入活动地图
function PKBattleActivity:PlayerEnterMap(player, mapID)
if mapID == ACTIVITY_CONFIG.MAP_ID and isActivityRunning then
-- 初始化玩家积分
local pid = getplayerid(player)
if not playerScores[pid] then
playerScores[pid] = 0
end
-- 设置玩家在活动地图中死亡不掉经验武勋
if ACTIVITY_CONFIG.NO_EXP_LOSS then
setplayerdata(player, "NOGETEXP", 1) -- 杀怪不增加经验
end
sendmsg(player, 6, "你已进入PK乱斗活动地图,杀敌获得积分,死亡不掉经验武勋!")
end
end
-- 玩家击杀其他玩家
function PKBattleActivity:PlayerKillPlayer(killer, victim)
if not isActivityRunning then
return
end
local killerID = getplayerid(killer)
local victimMap = getplayermap(victim)
-- 检查是否在活动地图
if victimMap == ACTIVITY_CONFIG.MAP_ID then
-- 增加积分
if not playerScores[killerID] then
playerScores[killerID] = 0
end
playerScores[killerID] = playerScores[killerID] + ACTIVITY_CONFIG.KILL_SCORE
-- 通知击杀者
sendmsg(killer, 6, string.format("击杀成功!获得%d积分,当前积分:%d",
ACTIVITY_CONFIG.KILL_SCORE, playerScores[killerID]))
end
end
-- 活动结束
function PKBattleActivity:EndActivity()
if not isActivityRunning then
return
end
isActivityRunning = false
-- 计算排名
local sortedPlayers = {}
for pid, score in pairs(playerScores) do
table.insert(sortedPlayers, {pid = pid, score = score})
end
table.sort(sortedPlayers, function(a, b)
return a.score > b.score
end)
-- 发放奖励
for rank, playerData in ipairs(sortedPlayers) do
local rewardConfig = nil
if rank == 1 then
rewardConfig = ACTIVITY_CONFIG.REWARDS[1]
elseif rank == 2 then
rewardConfig = ACTIVITY_CONFIG.REWARDS[2]
elseif rank == 3 then
rewardConfig = ACTIVITY_CONFIG.REWARDS[3]
elseif rank >= 4 and rank <= 10 then
rewardConfig = ACTIVITY_CONFIG.REWARDS[4]
elseif rank >= 11 and rank <= 100 then
rewardConfig = ACTIVITY_CONFIG.REWARDS[11]
end
if rewardConfig then
local player = getplayer(playerData.pid)
if player then
-- 发放奖励物品
giveitem(player, rewardConfig.item_id, rewardConfig.count)
-- 通知玩家
sendmsg(player, 6, string.format("PK乱斗活动第%d名,获得%d个强化石!",
rank, rewardConfig.count))
end
end
end
-- 广播活动结束
sendmsgnew(nil, 255, 255, "PK乱斗活动结束!奖励已发放!", 1, 5)
-- 清理数据
playerScores = {}
-- 将所有玩家传送出活动地图
local allPlayers = getmapactor(ACTIVITY_CONFIG.MAP_ID, 0)
for _, player in ipairs(allPlayers) do
mapmove(player, 101, 209, 314) -- 传送到安全地图(根据ServerHomeMapInfo0配置)
end
end
-- GM命令:开始活动
function PKBattleActivity:GM_StartActivity(player)
if getplayerdata(player, "GMLEVEL") >= 10 then -- 需要GM权限(根据GameData表StartPermission配置)
self:StartActivity()
sendmsg(player, 6, "PK乱斗活动已开始!")
end
end
return PKBattleActivity
```
### 2. 活动触发脚本
**文件位置**:`服务端/scripts/活动/PK乱斗活动触发.lua`
```lua
-- PK乱斗活动触发脚本
local PKBattleTrigger = require("scripts/活动/PK乱斗活动")
-- 注册事件
registerevent("PLAYERENTERMAP", function(player, mapID)
PKBattleTrigger:PlayerEnterMap(player, mapID)
end)
registerevent("PLAYERKILLPLAYER", function(killer, victim)
PKBattleTrigger:PlayerKillPlayer(killer, victim)
end)
-- GM命令
registercmd("startpkbattle", function(player)
PKBattleTrigger:GM_StartActivity(player)
end)
-- 定时器回调
function EndPKBattleActivity()
PKBattleTrigger:EndActivity()
end
```
## 二、配置文件
### 1. 活动地图配置
**文件位置**:`服务端/配置/地图配置/MapInfo.json`
```json
{
"9999": {
"MapName": "PK乱斗场",
"MapType": 0,
"SafeZone": 0, -- 非安全区
"Width": 100,
"Height": 100,
"MinLevel": 1,
"MaxLevel": 255,
"DieMode": 1, -- 死亡模式
"ReviveMap": 9999, -- 原地复活
"ReviveX": 50,
"ReviveY": 50
}
}
```
### 2. 刷怪表配置(如果需要活动怪物)
**文件位置**:`服务端/配置/刷怪表/MonGen.csv`
```
ID,Map,X,Y,MonId,Range,Qty,time,DieShow,Dir,MiniMapDieShow,LeastNum,IgnoreLine,Moncall,BaseMoncall,DisplayControl,DieModeRefresh,BornRange
999901,9999,50,50,0,20,0,0,"{1,2,3}",0,"{2}",0,"","","",0,"",-1
```
### 3. 掉落表配置(活动奖励)
**文件位置**:`服务端/配置/掉落表/Drop.csv`
```
ID,Name,Item1,Count1,Rate1,Item2,Count2,Rate2,Item3,Count3,Rate3,Item4,Count4,Rate4,Item5,Count5,Rate5
9999,PK乱斗奖励,1001,1,10000,0,0,0,0,0,0,0,0,0,0,0,0
```
## 三、客户端配置(可选)
### 1. 活动界面脚本
**文件位置**:`客户端/lua/界面/PK乱斗活动.lua`
```lua
-- PK乱斗活动界面
local PKBattleUI = {}
function PKBattleUI:ShowActivityPanel()
-- 显示活动界面,包含倒计时、当前积分、实时排名
local timeLeft = 20 * 60 -- 20分钟
local myScore = SL:GetValue("ACTOR_GM_DATA_BY_ID", getplayerid(), "PK_BATTLE_SCORE") or 0
-- 使用FGUI创建界面
FGUI:Open("PKBattlePanel")
end
-- 监听积分更新
SL:AddEventListener("LUA_EVENT_ACTOR_GMDATA_UPDATE", function(data)
if data.key == "PK_BATTLE_SCORE" then
-- 更新界面显示
end
end)
return PKBattleUI
```
## 四、操作流程
### 步骤1:创建服务端脚本文件夹
1. 在服务端根目录创建:`scripts/活动/`文件夹
2. 将`PK乱斗活动.lua`和`PK乱斗活动触发.lua`放入该文件夹
### 步骤2:配置地图
1. 打开`服务端/配置/地图配置/MapInfo.json`
2. 添加活动地图配置(ID: 9999)
3. 确保地图文件`Map/9999.map`存在(可以使用地图编辑器创建)
### 步骤3:配置刷怪表(可选)
1. 打开`服务端/配置/刷怪表/MonGen.csv`
2. 添加活动地图的刷怪点配置
### 步骤4:配置掉落表
1. 打开`服务端/配置/掉落表/Drop.csv`
2. 添加奖励掉落配置(ID: 9999)
### 步骤5:配置强化石物品
1. 在物品表中确保ID 1001是强化石
2. 如果没有,需要在`服务端/配置/物品表/Item.csv`中添加
### 步骤6:重启服务端
1. 重启服务端使配置生效
### 步骤7:启动活动
1. 在游戏中GM使用命令:`/startpkbattle`
2. 玩家进入地图9999即可参与活动
## 五、功能说明
1. **死亡保护**:通过`setplayerdata(player, "NOGETEXP", 1)`实现死亡不掉经验
2. **武勋保护**:活动期间不会触发武勋系统相关逻辑
3. **积分系统**:每击杀1人获得1积分,实时记录
4. **奖励发放**:活动结束后自动发放强化石奖励
5. **时间控制**:20分钟自动结束,通过定时器控制
6. **排名计算**:按积分从高到低排序,前100名有奖
## 六、注意事项
1. 确保地图9999在MapInfo.json中正确配置
2. 强化石物品ID需要与实际物品表一致
3. GM命令需要GM权限等级≥10(根据GameData表配置)
4. 活动地图建议设置为非安全区(SafeZone: 0)
5. 玩家死亡后原地复活,保持活动连续性
所有文件保存后,重启服务端即可使用该PK乱斗活动系统。
← 返回问答库