一、问题场景
在传奇游戏开发中,经常需要限制玩家佩戴重复装备(如:禁止同时戴两个“火焰戒指”)。这种需求常见于戒指、手镯等部位。下面通过 Gee引擎/Legend引擎 的脚本实现方法,分步骤详解。
二、核心原理
数据库设置:标记物品的唯一性
穿戴触发:使用 @TakeOn 事件检测
遍历检测:检查玩家全身装备是否重复
三、详细步骤(附代码)
数据库配置(关键!)
打开数据库管理工具(如DB Commander),找到物品表(StdItems.DB):
为需要限制的物品添加 唯一标识,例如在 Stdmode 或 Reserved 字段设置特殊值(如 99)
示例:火焰戒指的 Reserved=99
添加穿戴触发脚本
在服务端的 穿戴触发文件(如:Mir200\Envir\Market_Def\QFunction-0.txt)中添加:
[@TakeOn] --穿戴时自动触发
IF
CheckItemAddValue("火焰戒指", 0) = 99 --检测物品是否被标记为"唯一"
ACT
遍历6个首饰位(引擎不同数值不同)
CALL [\系统功能\物品检测.txt] @检测重复装备
[@检测重复装备]
IF
CheckContainsText("火焰戒指", 0) --检查第一个首饰位
ACT
无需操作,继续检测下一个位置
ELSEACT
GOTO @检测位置2
...(此处省略中间4个位置的检测)...
[@检测位置6]
IF
CheckContainsText("火焰戒指", 5) --第6个首饰位
ACT
SendMsg 5 "错误:你已佩戴[火焰戒指],无法重复穿戴!"
TakeOffItem "火焰戒指" 1 --强制脱下新戴的装备
Break
ELSEACT
SendMsg 5 "装备佩戴成功!"
🔥 代码解释:
- 当玩家穿上标记为 Reserved=99 的物品时,自动触发检测
- 遍历所有首饰栏位置(通常位置 0~5)
- 发现重复则强制脱下并提示
其他方法:自定义变量记录
若引擎不支持遍历,可用变量标记状态(需配合登录脚本重置):
[@TakeOn]
IF
EQUAL <$CURRTEMNAME> "火焰戒指" --当前穿戴的是目标装备
ACT
MOV D99 1 --设置变量D99=1(表示已佩戴)
[@TakeOff] --脱下时重置
IF
EQUAL <$CURRTEMNAME> "火焰戒指"
ACT
MOV D99 0 --重置为未佩戴
[@TakeOn] --再次穿戴时检测
IF
EQUAL <$CURRTEMNAME> "火焰戒指"
Large D99 0 --检查变量是否>0
ACT
SendMsg 5 "错误:禁止重复佩戴!"
TakeOffItem "火焰戒指" 1
四、避坑指南
位置偏移问题:
首饰栏位置索引可能因引擎而异(Hero引擎常用 0~5,Gee引擎可能不同)
解决方案:用 GetUserItemName 命令遍历真实位置
多角色适配:
#IF
GetHumanItemNames <$USERNAME> ;获取全身装备名称
#ACT
在返回的字符串中用 InStr 搜索重复名称
自定义装备位:
若支持Lua脚本(如GEE引擎),可直接调用:
local itemPos = {10,11,12,13,14,15} --自定义装备位
for _, pos in ipairs(itemPos) do
if GetItemName(pos) == "火焰戒指" then
SystemTip("禁止重复佩戴!")
return
end
end
五、效果展示
✅ 尝试佩戴第二个火焰戒指时,自动弹出提示并脱下
✅ 背包中的重复物品无法双击使用
✅ 玩家交易时自动检测穿戴状态
附:兼容性说明
引擎类型 支持方案
GEE/Legend引擎 直接使用遍历检测法
Hero/Blue引擎 优先用变量标记法
翎风引擎 调用 CheckItemPosition

