在传奇服务端中,要让组队的两个角色始终保持在同一地图且位置相近,需通过QFunction脚本监听组队状态,并在成员移动或传送时强制同步坐标。该方法适用于GOM、HERO等主流引擎,不依赖外部插件。
一、确认组队状态检测命令
服务端可通过CHECKGROUP命令判断玩家是否处于组队中,并获取队友名称。在QFunction.txt中使用如下结构:
[@CheckGroupMember]
IF
CHECKGROUP
ACT
SENDMSG 7 你当前处于组队状态。
但此命令仅返回是否组队,无法直接获取队友坐标。需结合HUM数据库或内存变量实现位置同步。
二、利用全局变量记录队长位置
设定组队中一人为主角色(如队长),其每次移动后自动更新全局变量。其他队员定时读取该变量并传送至附近位置。
在QFunction.txt中添加:
[@MapMove]
IF
CHECKGROUP
EQUAL GROUPMASTER USERNAME
ACT
SET [TEAM_X] CURR_X
SET [TEAM_Y] CURR_Y
SET [TEAM_MAP] MAPNAME
其中GROUPMASTER为系统变量(部分引擎需用MASTER),表示队长名称。CURR_X、CURR_Y为当前坐标,MAPNAME为地图名。
三、队员定时检测并传送
队员需定期检查是否与队长同图且距离过远。可在[@LoginSuccess]或[@PlayerDie]等高频触发点加入校验逻辑:
[@SyncTeamPosition]
IF
CHECKGROUP
NOTEQUAL USERNAME GROUPMASTER
ACT
MOVETOGROUP
但原生引擎无MOVETOGROUP命令,需手动计算坐标。替代方案:
IF
CHECKGROUP
NOTEQUAL USERNAME GROUPMASTER
EXISTVAR [TEAM_MAP]
ACT
GETVARIABLE [TEAM_MAP] N1
GETVARIABLE [TEAM_X] N2
GETVARIABLE [TEAM_Y] N3
CALC N4 N2 + 1
CALC N5 N3 + 1
MAPMOVE
此脚本将队员传送到队长右侧1格位置。注意:频繁传送可能引发卡顿,建议加入冷却判断。
四、防止循环传送与坐标冲突
若两人同时移动,可能互相触发传送导致死循环。需增加距离判断:
IF
CHECKGROUP
NOTEQUAL USERNAME GROUPMASTER
EXISTVAR [TEAM_MAP]
EQUAL MAPNAME
ACT
CALC N10 CURR_X -
CALC N11 CURR_Y -
ABS N10
ABS N11
IFSMALL N10 5
IFSMALL N11 5
GOTO @NoNeedMove
; 否则执行传送
...
[@NoNeedMove]
; 不操作
ABS取绝对值,确保距离计算为正数。仅当X或Y差值大于等于5格时才触发传送。
五、处理跨地图同步
当队长切换地图(如使用回城石),队员需立即跟随。在[@MapMove]中加入地图变更广播:
[@MapMove]
IF
CHECKGROUP
EQUAL USERNAME GROUPMASTER
ACT
SET [TEAM_MAP] MAPNAME
SET [TEAM_X] CURR_X
SET [TEAM_Y] CURR_Y
; 通知队员
KICKALLGROUPMSG 队长已移动,请同步位置。
队员端通过监听KICKALLGROUPMSG(部分引擎支持)或定时轮询变量实现响应。
六、完整脚本示例
在QFunction.txt末尾添加:
[@MapMove]
IF
CHECKGROUP
EQUAL USERNAME GROUPMASTER
ACT
SET [TEAM_X] CURR_X
SET [TEAM_Y] CURR_Y
SET [TEAM_MAP] MAPNAME
[@CheckTeamSync]
IF
CHECKGROUP
NOTEQUAL USERNAME GROUPMASTER
EXISTVAR [TEAM_MAP]
ACT
GOTO @DoSyncCheck
[@DoSyncCheck]
IF
EQUAL MAPNAME
ACT
CALC N1 CURR_X -
CALC N2 CURR_Y -
ABS N1
ABS N2
IFSMALL N1 6
IFSMALL N2 6
GOTO @EndSync
; 超出范围,传送
CALC N3 + 2
CALC N4 + 2
MAPMOVE
[@EndSync]
再通过[@LoginSuccess]或[@Heartbeat](如有)每10秒调用一次[@CheckTeamSync]。
七、注意事项
全局变量[TEAM_X]等对所有玩家共享,多人组队需改用玩家私有变量(如_TEAM_X),但部分引擎不支持动态变量名。
BOSS房、安全区等特殊地图应禁止自动传送,需在脚本开头加入地图黑名单判断。
频繁MAPMOVE可能被判定为异常行为,建议最小间隔5秒。
通过上述脚本,可实现组队成员自动靠近,确保两人始终处于可协作范围内。核心在于利用全局变量传递位置信息,并通过距离阈值控制传送频率。

