现在请详细阐述服务器端的具体实现步骤与代码示例。
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-05-03 15:30:09 |
👁️ 阅读: 6
服务器端的具体实现主要涉及脚本编写、消息通信和功能触发。以下是详细步骤和代码示例:
## 一、NPC脚本配置与触发
### 1. 基础配置方案
NPC脚本文件需放置在 `MirRXJH\Mir200\Envir\Market_Def\` 目录下(支持子文件夹)。例如,脚本路径 `主城\银娇龙-101.lua` 对应 `Npclist.xls` 表中的 `Script` 字段,`101` 对应 `MapName` 字段。
**注意**:脚本文件必须保存为 **ANSI 或 GB2312** 编码格式,否则会导致乱码或无法加载。
### 2. 通过QFunction触发器执行
可以在服务端功能触发器 `QFunction` 中,根据点击的NPC ID执行相应脚本。例如:
```lua
-- 在QFunction-0.lua中处理NPC点击
function OnClickNPC(actor, npcID)
if npcID == 1001 then
-- 执行对应脚本逻辑
sendmsg(actor, 6, "你点击了NPC 1001")
end
end
```
### 3. 客户端消息触发
客户端点击NPC时发送消息,服务端接收后判断NPC距离并执行脚本。例如:
```lua
-- 服务端接收消息处理
function handlerequest(actor, msgID, param1, param2, param3, str)
if msgID == 100 then
-- 判断NPC距离等逻辑
sendmymsg(actor, 200, 1, 2, 3, "[From Server]")
end
end
```
## 二、服务端与客户端消息通信
### 1. 客户端发送消息到服务端
```lua
-- 客户端发送消息
local msgID = 100
local paramInt1 = 1
local paramInt2 = 2
local paramInt3 = 3
local paramStr = "[From Client]"
SL:SendNetMsg(msgID, paramInt1, paramInt2, paramInt3, paramStr)
```
### 2. 服务端接收并响应
```lua
-- 服务端接收消息
function handlerequest(actor, msgID, param1, param2, param3, str)
print(msgID, param1, param2, param3, str)
-- 处理逻辑后发送响应给客户端
sendmymsg(actor, 200, 1, 2, 3, "[From Server]")
end
```
### 3. 客户端注册接收服务端消息
```lua
-- 客户端注册消息回调(在OnGameStateWorld之后)
local function networkCB(msgID, p1, p2, p3, str)
SL:Print("客户端接收消息", msgID, p1, p2, p3, str)
end
SL:RegisterNetMsg(200, networkCB)
```
## 三、功能脚本示例:气功方案保存与加载
### 1. 客户端UI触发消息
```lua
-- 客户端按钮点击发送消息
function SkillPracticePanel:OnClickPlan1(context)
SL:SendNetMsg(90020101, 1, 1, nil, nil)
end
```
### 2. 服务端处理消息并响应
```lua
-- 服务端处理气功方案消息
local function handleQiGongPlan(actor, msgID, code, planId, _, strInfo)
if code == 1 then
-- 发送确认框给客户端
sendmymsg(actor, 90020102, 1, planId, nil, "是否保存方案?")
elseif code == 2 then
-- 加载方案逻辑
local ok, err = QiGongPlan.load(actor, planId)
if ok then
sendmymsg(actor, 90020102, 3, planId, nil, nil) -- 加载成功
else
sendmymsg(actor, 90020102, 4, planId, nil, err or "加载失败")
end
elseif code == 3 then
-- 保存方案逻辑
local ok, err = QiGongPlan.save(actor, planId)
if ok then
sendmymsg(actor, 90020102, 5, planId, nil, nil) -- 保存成功
else
sendmymsg(actor, 90020102, 6, planId, nil, err or "保存失败")
end
end
end
```
### 3. 气功方案数据存储(使用玩家变量)
```lua
-- QiGongPlan.lua 部分代码
local QiGongPlan = {}
local HUMVAR_KEY = "T10"
function QiGongPlan.readQGAll(actor)
local j = gethumvar(actor, HUMVAR_KEY)
if j and j ~= "" then
local ok, t = pcall(json2tbl, j)
if ok and type(t) == "table" then
return t
end
end
return { limit = 3 }
end
function QiGongPlan.writeQGAll(actor, t)
sethumvar(actor, HUMVAR_KEY, tbl2json(t))
end
```
## 四、其他常用服务端接口示例
### 1. 设置玩家战斗力
```lua
setfightpower(actor, 10000)
```
### 2. 条件判断
```lua
local result = condition(actor, 10004)
if result then
sendmsg(actor, 6, "条件成立")
else
sendmsg(actor, 6, "条件不成立")
end
```
### 3. 设置自定义玩家数据(JSON格式)
```lua
setplayercustjosndata(actor, "测试1", "abc")
```
### 4. 设置转职等级
```lua
settargetinfo(actor, "RELEVEL", 8)
```
## 五、注意事项
1. **脚本编码**:必须使用 ANSI 或 GB2312 格式保存。
2. **消息通信**:客户端和服务端需要注册对应的消息ID。
3. **数据存储**:玩家数据可通过 `gethumvar`/`sethumvar` 或自定义接口存储。
4. **NPC距离判断**:客户端触发NPC时,服务端应验证玩家与NPC的距离。
以上步骤和代码示例展示了服务器端如何通过脚本配置、消息通信和功能触发来实现游戏逻辑。具体实现时需结合 `Npclist.xls`、`QFunction-0.lua` 以及相关配置表进行开发。
← 返回问答库