课程入口
课程内容整理:客户端与服务端通信
1. 协议通信流程
-
客户端发送协议
- 点击装备位置(如衣服、武器)触发事件,发送协议到服务端。
- 示例代码:发送
100号协议
,参数为位置标识(如0
表示衣服,1
表示武器)。
-- 客户端发送协议示例
SendProtocol(100, {0}) -- 发送强化位置(衣服)
-
服务端接收与处理
- 在
QF
脚本中监听协议,根据参数分发逻辑。
- 示例:接收
100号协议
,判断参数后下发装备数据(如999号协议
)。
-- 服务端处理示例
if message.ID == 100 then
if param1 == 0 then
SendToClient(999, "衣服内容") -- 下发衣服属性
elseif param1 == 1 then
SendToClient(999, "武器内容") -- 下发武器属性
end
end
-
客户端接收协议
-- 客户端接收协议示例
OnProtocol(999, function(data)
print("收到装备数据:", data)
UpdateUI(data) -- 更新界面
end)
2. 物品变量存储与获取
-
服务端存储变量
- 使用
SetItemVariable
在服务端为装备位置存储变量(如强化等级、属性)。
-- 服务端存储示例
SetItemVariable(player, 1, "StrengthenLevel", 5) -- 1号位置武器强化等级=5
-
客户端获取变量
- 通过
GetItemVariable
从服务端同步的变量中读取数据。
- 问题排查:需确保客户端配置允许变量下发(如
M2GameDate
表中启用物品变量)。
-- 客户端获取示例
local itemData = GetItemDataByPosition(1) -- 获取1号位置装备数据
local strengthenLevel = GetItemVariable(itemData.MakeIndex, "StrengthenLevel")
print("强化等级:", strengthenLevel)
3. 关键问题与解决
-
协议未接收问题
- 原因:协议ID冲突或参数类型错误(如误传布尔值而非字符串)。
- 解决:规范协议命名空间(如
NPC_73
专用协议),严格校验参数类型。
-
物品变量未下发问题
- 原因:客户端未配置变量下发范围或服务端未触发更新。
- 解决:
- 检查
M2GameDate
表中物品变量配置(如字符串变量1-20)。
- 确保服务端调用
UpdateClientItem
同步变量变更。
4. 两种数据交互方式对比
方式 |
优点 |
缺点 |
适用场景 |
协议通信(服务端下发) |
数据安全,逻辑可控 |
需频繁通信,代码复杂 |
敏感数据(如强化结果) |
物品变量(客户端读取) |
简单直接,减少通信 |
客户端可篡改,需服务端校验 |
非敏感数据(如显示属性) |
5. 代码优化建议
-
协议封装
使用模块化管理协议,避免裸写协议ID:
-- 协议模块示例
local Protocol = {
EQUIP_STRENGTHEN = 100,
EQUIP_INFO = 999
}
SendProtocol(Protocol.EQUIP_STRENGTHEN, {0})
-
变量监听
客户端监听变量变更事件,动态更新UI:
OnItemVariableUpdate(function(makeIndex, key, value)
if key == "StrengthenLevel" then
UpdateStrengthenUI(makeIndex, value)
end
end)
6. 总结
- 核心要点:
- 协议通信适合实时交互,物品变量适合静态数据同步。
- 务必在服务端校验客户端传来的数据(如强化等级是否合法)。
- 后续学习:
注:课程中涉及的代码为示例片段,实际需根据项目结构调整。遇到变量未下发时,优先检查服务端配置和同步逻辑。