传奇GM在线给玩家发装备与取走装备脚本:NPC对话+GM命令+跨人发放全写法

来源: 作者: 点击:
一、前置条件
GM账号已加入 M2 → 列表信息 → 管理员列表(或 Mir200\Envir\AdminList.txt / GMList.txt),权限等级设到最高(一般10),重登录生效。
物品名必须与 Mir200\Envir\StdItems.txt 里的 Name 字段完全一致,“屠龙刀”和“屠龙”不是同一个东西,写错不刷。
脚本文件一律 ANSI 编码,放 Mir200\Envir\Market_Def\ 或 QuestDiary\ 下,改完 @ReloadNpc 或 M2 重载管理脚本。

二、NPC脚本里给“当前对话玩家”发装备 / 收装备(最常用)
Market_Def\GM发放员-3.txt(盟重土城地图号3):
[@main]
SAY

GM专用面板:\
<给自身屠龙/@giveme>\
<收回自身屠龙/@takeme>\
<给战士套装/@warsuit>\
<脱下身上屠龙/@takewear>\
<关闭/@exit>

[@giveme]
if

act

GIVE 屠龙 1
SENDMSG 6 已发放:屠龙 x1
CLOSE

[@takeme]
if

CHECKITEM 屠龙 1
act

TAKE 屠龙 1
SENDMSG 6 已收回背包内:屠龙 x1
elsesay

背包里没有屠龙。

[@warsuit]
if

CHECKJOB Warrior
act

GIVE 屠龙 1
GIVE 战神盔甲(男) 1
GIVE 力量戒指 1
GIVE 骑士手镯 1
GIVE 绿色项链 1
SENDMSG 6 战士套装已发放
elsesay

非战士职业,无法领取。

[@takewear]
if

act

TAKEW 屠龙 1
SENDMSG 6 已脱下并收回身上穿戴的屠龙
CLOSE

[@exit]
say

慢走。

命令区分:
• GIVE 物品 数量 → 进背包

- TAKE 物品 数量 → 只扣背包内,不扣身上穿的
• TAKEW 物品 数量 → 只卸身上穿戴栏的装备

• CHECKITEM → 判背包;CHECKUSEITEM 位置号 → 判身上某槽位是否穿着

三、游戏内直接敲的GM在线命令(针对自己或指定玩家)
通用 Mir / GOM / Hero / LegendM2 体系:
@Give 角色名 物品名 数量
例:@Give 张三 屠龙 1 → 给在线玩家“张三”发屠龙
@GiveItem 物品名 数量 角色名
例:@GiveItem 圣战头盔 1 张三
@Make 角色名 物品ID 数量
例:@Make 张三 1001 1 (1001为StdItems.txt里物品ID)
@TakeUserItem 角色名 物品名 数量 → 没收指定玩家背包物品
对自己用把角色名换成 自己 / SELF 或不填角色名。
Command.ini 里这些命令前缀可被服务端改写,以你版本实际为准。

四、GM NPC 输入“玩家名+物品名+数量”跨人在线发放(高级)
适合GM地图专属NPC,流程:弹框输物品名 → 输数量 → 输目标角色名 → 校验在线 → 跨人发/收。

1)MerChant.txt 加GM地图NPC(假设GM地图号 9999):
GM操作台 9999 20 20 GM操作台 0 15 0 0 0

2)Market_Def\GM操作台-9999.txt:
[@main]
SAY

在线给/拿玩家装备:\
<给指定玩家物品/@senditem>\
<拿指定玩家物品/@takeitem>\
<关闭/@exit>

[@senditem]
@@InPutString1
@@InPutInteger2
@@InPutString3

;Hero端回调段名 CallInPutString / CallInPutInteger,3K端去掉Call,下面按Hero写
[@CallInPutString1]
SAY

物品名已记录:S1\
<继续输数量/@nextnum>

[@nextnum]
@@InPutInteger2

[@CallInPutInteger2]
SAY

数量已记录:N2\
<输目标玩家名/@nextname>

[@nextname]
@@InPutString3

[@CallInPutString3]
if

CHECKONLINE $STR(S3)
act

CALCVAR GLOBAL Z12 = $STR(S1)
CALCVAR GLOBAL Z13 = $STR(N2)
SAVEVAR GLOBAL Z12 ..\QuestDiary\数据文件\ZSave.txt
SAVEVAR GLOBAL Z13 ..\QuestDiary\数据文件\ZSave.txt
HCALL $STR(S3) @给与物品
SENDMSG 7 已向玩家 <$STR(S3)> 发送 S1 x N2
GOTO @main
elsesay

目标玩家不在线。

[@takeitem]
@@InPutString4
@@InPutString5

[@CallInPutString4]
SAY

要收回的物品名:S4\
<输目标玩家名/@takename>

[@takename]
@@InPutString5

[@CallInPutString5]
if

CHECKONLINE $STR(S5)
act

CALCVAR GLOBAL Z11 = $STR(S4)
SAVEVAR GLOBAL Z11 ..\QuestDiary\数据文件\ZSave.txt
HCALL $STR(S5) @拿走物品
SENDMSG 7 已向玩家 <$STR(S5)> 收回 S4
GOTO @main
elsesay

目标玩家不在线。

[@exit]
say

结束。

3)QManage.txt 里写实际执行段(被 HCALL 调起时在目标玩家上下文执行):
[@给与物品]
ACT

GIVE GLOBAL(Z12) GLOBAL(Z13)
MESSAGEBOX 收到来自[GM]发送的物品:S12 数量:S13
SENDMSG 7 收到GM发放物品
BREAK

[@拿走物品]
ACT

TAKE $GLOBAL(Z11) 1
TAKEW $GLOBAL(Z11) 1
MESSAGEBOX 你的物品:S11 已被[GM]强制收取
SENDMSG 7 物品被GM收回
BREAK

要点:HCALL 目标角色名 @标签 → 后续 GIVE/TAKE 在对方身上执行;Z11/Z12/Z13 用 QuestDiary\数据文件\ZSave.txt 做全局变量中转;HCALL 不支持的引擎改用 GIVEITEM/TAKEITEM 配合角色ID写法:
GIVEITEM 角色名 物品名 数量
TAKEITEM 角色名 物品名 数量
例:GIVEITEM 张三 屠龙 1 / TAKEITEM 张三 屠龙 1

五、批量套装发放片段
[@givefullset]
if

act

GIVE 屠龙 1
GIVE 战神盔甲(男) 1
GIVE 力量戒指 2
GIVE 骑士手镯 2
GIVE 绿色项链 1
GIVE 战神头盔 1
GIVE 战神靴 1
GIVE 烈火剑法 1
SENDMSG 6 全套战士装备已发放
CLOSE

六、强制清包 / 清身(罚没场景)
[@clearall]
if

act

TAKE 屠龙 1
TAKE 裁决之杖 1
TAKEW 屠龙 1
TAKEW 裁决之杖 1
; 要清更多逐行加 TAKE / TAKEW
SENDMSG 7 违规物品已回收
CLOSE

七、常见不生效原因
• 物品名和 StdItems.txt 不一致 → GIVE 无反应、GM命令提示物品不存在

• TAKE 收不到身上穿的 → 忘了用 TAKEW,TAKE 只认背包

• HCALL 不触发 → 目标不在线、角色名拼错、QManage.txt 没加载、变量文件目录不存在

• 脚本UTF-8 → 中文全乱码,改 ANSI

• GM敲命令没反应 → 权限不够、Command.ini 改了前缀、没重载管理员列表

• 跨人发完对方看不到 → 没走 HCALL/GIVEITEM,只在GM自己上下文 GIVE 了

GM在线发装备核心就三组:NPC里 GIVE/TAKE/TAKEW 管当前玩家;聊天框 @Give/@Make/@TakeUserItem 管指定角色;跨人在线发收用 HCALL + QManage 回调段或 GIVEITEM/TAKEITEM,物品名对齐 StdItems.txt 就不会偏。