一、问题场景
在传奇游戏开发中,经常需要限制玩家佩戴重复装备(如:禁止同时戴两个“火焰戒指”)。这种需求常见于戒指、手镯等部位。下面通过Gee引擎/Legend引擎的脚本实现方法,分步骤详解。
二、核心原理
数据库设置:标记物品的唯一性
穿戴触发:使用@TakeOn事件检测
遍历检测:检查玩家全身装备是否重复
三、详细步骤(附代码)
数据库配置(关键!)
打开数据库管理工具(如DBCommander),找到物品表(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
SendMsg5"错误:你已佩戴[火焰戒指],无法重复穿戴!"
TakeOffItem"火焰戒指"1--强制脱下新戴的装备
Break
ELSEACT
SendMsg5"装备佩戴成功!"
🔥代码解释:
-当玩家穿上标记为Reserved=99的物品时,自动触发检测
-遍历所有首饰栏位置(通常位置0~5)
-发现重复则强制脱下并提示
其他方法:自定义变量记录
若引擎不支持遍历,可用变量标记状态(需配合登录脚本重置):
[@TakeOn]
IF
EQUAL<$CURRTEMNAME>"火焰戒指"--当前穿戴的是目标装备
ACT
MOVD991--设置变量D99=1(表示已佩戴)
[@TakeOff]--脱下时重置
IF
EQUAL<$CURRTEMNAME>"火焰戒指"
ACT
MOVD990--重置为未佩戴
[@TakeOn]--再次穿戴时检测
IF
EQUAL<$CURRTEMNAME>"火焰戒指"
LargeD990--检查变量是否>0
ACT
SendMsg5"错误:禁止重复佩戴!"
TakeOffItem"火焰戒指"1
四、避坑指南
位置偏移问题:
首饰栏位置索引可能因引擎而异(Hero引擎常用0~5,Gee引擎可能不同)
解决方案:用GetUserItemName命令遍历真实位置
多角色适配:
#IF
GetHumanItemNames<$USERNAME>;获取全身装备名称
#ACT
在返回的字符串中用InStr搜索重复名称
自定义装备位:
若支持Lua脚本(如GEE引擎),可直接调用:
localitemPos={101112131415}--自定义装备位
for_posinipairs(itemPos)do
ifGetItemName(pos)=="火焰戒指"then
SystemTip("禁止重复佩戴!")
return
end
end
五、效果展示
✅尝试佩戴第二个火焰戒指时,自动弹出提示并脱下
✅背包中的重复物品无法双击使用
✅玩家交易时自动检测穿戴状态
附:兼容性说明
引擎类型支持方案
GEE/Legend引擎直接使用遍历检测法
Hero/Blue引擎优先用变量标记法
翎风引擎调用CheckItemPosition
在传奇游戏开发中,经常需要限制玩家佩戴重复装备(如:禁止同时戴两个“火焰戒指”)。这种需求常见于戒指、手镯等部位。下面通过Gee引擎/Legend引擎的脚本实现方法,分步骤详解。
二、核心原理
数据库设置:标记物品的唯一性
穿戴触发:使用@TakeOn事件检测
遍历检测:检查玩家全身装备是否重复
三、详细步骤(附代码)
数据库配置(关键!)
打开数据库管理工具(如DBCommander),找到物品表(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
SendMsg5"错误:你已佩戴[火焰戒指],无法重复穿戴!"
TakeOffItem"火焰戒指"1--强制脱下新戴的装备
Break
ELSEACT
SendMsg5"装备佩戴成功!"
🔥代码解释:
-当玩家穿上标记为Reserved=99的物品时,自动触发检测
-遍历所有首饰栏位置(通常位置0~5)
-发现重复则强制脱下并提示
其他方法:自定义变量记录
若引擎不支持遍历,可用变量标记状态(需配合登录脚本重置):
[@TakeOn]
IF
EQUAL<$CURRTEMNAME>"火焰戒指"--当前穿戴的是目标装备
ACT
MOVD991--设置变量D99=1(表示已佩戴)
[@TakeOff]--脱下时重置
IF
EQUAL<$CURRTEMNAME>"火焰戒指"
ACT
MOVD990--重置为未佩戴
[@TakeOn]--再次穿戴时检测
IF
EQUAL<$CURRTEMNAME>"火焰戒指"
LargeD990--检查变量是否>0
ACT
SendMsg5"错误:禁止重复佩戴!"
TakeOffItem"火焰戒指"1
四、避坑指南
位置偏移问题:
首饰栏位置索引可能因引擎而异(Hero引擎常用0~5,Gee引擎可能不同)
解决方案:用GetUserItemName命令遍历真实位置
多角色适配:
#IF
GetHumanItemNames<$USERNAME>;获取全身装备名称
#ACT
在返回的字符串中用InStr搜索重复名称
自定义装备位:
若支持Lua脚本(如GEE引擎),可直接调用:
localitemPos={101112131415}--自定义装备位
for_posinipairs(itemPos)do
ifGetItemName(pos)=="火焰戒指"then
SystemTip("禁止重复佩戴!")
return
end
end
五、效果展示
✅尝试佩戴第二个火焰戒指时,自动弹出提示并脱下
✅背包中的重复物品无法双击使用
✅玩家交易时自动检测穿戴状态
附:兼容性说明
引擎类型支持方案
GEE/Legend引擎直接使用遍历检测法
Hero/Blue引擎优先用变量标记法
翎风引擎调用CheckItemPosition

