官方原版中在服务器端如何创建某个地图的副本以及如何获取该副本地图的内的玩家?给出代码实现
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-05-12 15:47:37 |
👁️ 阅读: 12
在热血江湖服务器端,可以通过以下步骤创建副本地图和获取副本地图内的玩家:
## 1. 创建副本地图
使用 `addmirrormap` 接口创建镜像地图(副本),该接口会基于原地图创建一个新的副本地图。
```lua
-- 创建副本地图
local result = addmirrormap("101", "new101", "副本地图", 3600, "backMapId", 1, 202, 277)
if result then
print("创建副本地图成功")
else
print("创建副本地图失败")
end
```
参数说明:
- `oldMap`: 原地图ID(MapInfo中的MapId)
- `newMap`: 新地图ID(副本ID)
- `newName`: 新地图名称
- `time`: 有效时间(秒),最大2100000
- `backMap`: 回城地图(有效时间结束后传回的地图)
- `miniMapID`: 小地图编号(预留,暂时无效)
- `posmX`: 返回地图的X坐标
- `posmY`: 返回地图的Y坐标
## 2. 获取副本地图内的玩家
### 方法一:获取地图内所有玩家
```lua
-- 获取副本地图内所有玩家
local mapid = "new101" -- 副本地图ID
local playerCount = getmap(mapid, "*", "*", "*", 1, "*")
if playerCount then
print("副本地图内玩家数量:" .. playerCount)
end
```
### 方法二:获取地图内特定范围的玩家对象ID列表
```lua
-- 获取副本地图内指定范围内的玩家对象ID
local mapid = "new101"
local centerX = 100 -- 中心点X坐标
local centerY = 100 -- 中心点Y坐标
local range = 50 -- 范围
local playerObjects = getmaprangeobjectid(mapid, centerX, centerY, range, 1)
if playerObjects and type(playerObjects) == "table" then
print("找到 " .. #playerObjects .. " 个玩家对象")
for i, objectId in ipairs(playerObjects) do
print("玩家对象ID: " .. objectId)
-- 可以进一步处理每个玩家对象
end
else
print("未找到玩家或获取失败")
end
```
`getmaprangeobjectid` 的 type 参数说明:
- `1`: 获取玩家
- `2`: 获取宝宝
- `4`: 获取怪物
- `16`: 获取NPC
- `32`: 获取虚拟玩家(机器人)
- 支持相加组合,如 `1+8` 获取所有玩家(包括死亡的)
## 3. 为副本地图添加定时器(可选)
如果需要副本地图有定时功能,可以添加地图定时器:
```lua
-- 为副本地图添加定时器
setenvirontimer("new101", 1, 3, "@副本定时函数")
-- 全局触发函数(需要在QF中使用g_前缀)
function g_副本定时函数()
print("副本地图定时器触发")
-- 这里可以执行副本地图内的逻辑
end
```
## 4. 镜像地图到期触发
当副本地图到期时,会触发 `g_mirrormapend` 函数:
```lua
function g_mirrormapend(actor, id)
sendmsg(actor, 6, "镜像地图编号:" .. id .. " 已到期")
-- 可以在这里处理副本结束后的逻辑
end
```
## 完整示例代码
```lua
-- 创建副本地图
local function createDungeonMap()
local result = addmirrormap("101", "dungeon_001", "副本-泫勃派", 1800, "101", 1, 208, 290)
if result then
print("副本地图创建成功:dungeon_001")
-- 添加副本定时器
setenvirontimer("dungeon_001", 1, 60, "@dungeonTimer")
return true
else
print("副本地图创建失败")
return false
end
end
-- 获取副本地图内所有玩家
local function getDungeonPlayers(dungeonMapId)
local players = getmaprangeobjectid(dungeonMapId, 0, 0, 9999, 1)
if players and type(players) == "table" then
return players
end
return {}
end
-- 副本定时器函数
function g_dungeonTimer()
local dungeonMapId = "dungeon_001"
local players = getDungeonPlayers(dungeonMapId)
if #players > 0 then
print("副本 " .. dungeonMapId .. " 内有 " .. #players .. " 名玩家")
-- 遍历处理每个玩家
for _, playerId in ipairs(players) do
-- 这里可以对每个玩家执行操作
sendmsg(playerId, 6, "副本剩余时间:30分钟")
end
end
end
```
这样你就可以创建副本地图并管理其中的玩家了。
← 返回问答库