自己做的单机版传奇,如何添加智能假人并实现互相PK

来源: 作者: 点击:
很多玩家在搭建好单机版传奇后,会感觉地图空空荡荡,缺少人气。想让服务器里热闹起来,加入能自主行动、甚至互相打架的假人系统是关键一步。下面从脚本编写到逻辑调试,一步步教你实现这个功能。

第一步:准备假人生成脚本

打开服务端目录下的 Mir200\Envir\Robot.txt 文件。这个文件负责控制机器人(也就是假人)的定时触发行为。在末尾添加一行:

;假人自动上线
#AutoRun NPC SEC 60 @MakeFakeHuman


这行代码的意思是每60秒执行一次 @MakeFakeHuman 标签下的指令。你可以根据自己需要调整时间间隔,比如改成30秒让假人刷新更频繁。

第二步:编写假人创建与登录逻辑

找到 Mir200\Envir\Market_Def\QFunction-0.txt 或者你自定义的NPC脚本文件,写入以下内容:

[@MakeFakeHuman]
#IF
CheckLevelEx > 0
#ACT
DelayGoto 1 ~CreateFakeMan
Break

[@~CreateFakeMan]
#IF
Random 5
#ACT
MOV D0 0
While D0 < 10
MOV S0 假人名字前缀
INC S0 <$STR(D0)>
DELAYGOTO 1000 @LoginFakeMan <$STR(S0)>
INC D0 1
EndWhile


这段脚本会随机生成10个带有不同编号的假人账号。注意把“假人名字前缀”换成你自己喜欢的名称,比如“流浪战士”“无名刀客”之类的,避免和真实玩家重名。

第三步:配置假人装备与初始状态

为了让假人看起来像真实玩家,需要给它们分配基础装备。在同一个脚本文件中继续添加:

[@LoginFakeMan]
#IF
CheckOnline <$SCRIPTPARAM1> = 0
#ACT
GMEXECUTE 召唤 <$SCRIPTPARAM1>
DELAYGOTO 500 @EquipFakeMan <$SCRIPTPARAM1>
Break

[@EquipFakeMan]
#IF
CheckOnline <$SCRIPTPARAM1> = 1
#ACT
GiveStateItem 布衣(男) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GiveStateItem 木剑 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GiveStateItem 蜡烛 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DELAYGOTO 300 @SetFakeManAI <$SCRIPTPARAM1>
Break


这里用GM命令将假人传送到当前地图,然后给予基础装备。装备ID和属性值可以根据你的版本自行修改。

第四步:核心部分——假人移动与PK逻辑

这是实现假人互动的关键。创建一个新的脚本段来控制假人的行为:

[@SetFakeManAI]
#IF
CheckOnline <$SCRIPTPARAM1> = 1
#ACT
MOV D1 0
While D1 < 50
RandomMove 3
DELAYGOTO 2000 @CheckFakeManTarget <$SCRIPTPARAM1>
INC D1 1
EndWhile
Break

[@CheckFakeManTarget]
#IF
CheckOnline <$SCRIPTPARAM1> = 1
CheckRangeMonCount <$MAP> <$X> <$Y> 8 0 > 0
#ACT
GetRandomMonName S1
AttackMon <$STR(S1)>
Break
#ELSEACT
RandomMove 2
Break


上面的代码让假人每隔2秒随机移动一次,并在周围8格范围内检测是否有怪物或其他假人。如果发现目标,就会发动攻击。

但要让假人之间互相PK,需要把其他假人也视为攻击对象。修改检测逻辑:

[@CheckFakeManTarget]
#IF
CheckOnline <$SCRIPTPARAM1> = 1
CheckRangeHumanCount <$MAP> <$X> <$Y> 8 0 > 1
#ACT
GetRandomHumanName S1
#IF
Equal <$STR(S1)> <$SCRIPTPARAM1>
#ACT
Break
#ELSESAY
<$STR(S1)>
DELAYGOTO 500 @AttackTarget <$SCRIPTPARAM1> <$STR(S1)>
Break
#ELSEACT
RandomMove 2
Break

[@AttackTarget]
#IF
CheckOnline <$SCRIPTPARAM1> = 1
CheckOnline <$SCRIPTPARAM2> = 1
#ACT
GMEXECUTE 攻击 <$SCRIPTPARAM1> <$SCRIPTPARAM2>
DELAYGOTO 8000 @SetFakeManAI <$SCRIPTPARAM1>
Break


这段代码会让假人在周围检测到其他玩家(包括假人)时,随机选择一个作为目标进行攻击。攻击冷却设为8秒,防止过于频繁。

第五步:处理假人死亡与复活

假人被杀死后需要重新生成,否则地图上的人会越来越少。在 QFunction-0.txt 中添加死亡触发:

[@OnDie_FakeMan]
#IF
CheckOnline <$KILLERNAME> = 1
#ACT
DELAYGOTO 60000 @MakeFakeHuman
Break


这样假人死亡后等待60秒会自动重新上线。你也可以缩短时间,比如改为30秒让战斗更激烈。

第六步:优化假人智能程度

为了让假人表现得更真实,可以加入以下细节:

;假人喊话功能
[@FakeManChat]
#IF
CheckOnline <$SCRIPTPARAM1> = 1
Random 10
#ACT
Say 兄弟们冲啊!
Break

;假人组队功能
[@FakeManGroup]
#IF
CheckOnline <$SCRIPTPARAM1> = 1
Random 20
#ACT
GroupCreate <$SCRIPTPARAM1>
GroupAddMember <$SCRIPTPARAM1> 假人名字后缀
Break


把这些功能通过定时器循环调用,假人就会时不时喊话、组队,看起来更像活人。

第七步:测试与调试

保存所有脚本文件后重启服务端。进入游戏观察假人是否正常出现:
• 假人应该会在各个地图随机走动

• 两个假人靠近时应该会互相攻击

• 被击杀的假人一段时间后会重新出现

• 假人不会攻击同队伍的成员(如果你启用了组队功能)

如果假人不移动,检查 Robot.txt 中的路径是否正确。如果假人不攻击,检查 CheckRangeHumanCount 的范围参数是否合适,以及 GMEXECUTE 攻击 命令在你的引擎中是否有效。某些引擎可能需要换成 Attack 或 Pk 命令。

最后提醒一下,假人数量不宜过多,建议控制在20-30个以内,否则会占用大量服务器资源导致卡顿。通过调整 @MakeFakeHuman 中的循环次数和生成间隔,可以找到最适合你机器配置的平衡点。