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

