要让受到飞剑攻击的怪物过来攻击你,需要在前端命中怪物时发送消息给服务端,然后服务端通过触发怪物仇恨转移机制来实现。
根据浮生梦老师前端课程内容,关键是在飞剑命中怪物时发送服务端消息。在你的代码中,`FeiJianSKill.sendHitMonster`函数已经包含了发送消息的逻辑:
```lua
---发送命中怪物
---@param mID string 怪物id
---@param swordId number 飞剑id
function FeiJianSKill.sendHitMonster(mID, swordId)
local mon = maptools.getActor(mID)
if not mon or mon:GetHP() <= 0 then
return
end
if not SL:GetMetaValue("TARGET_ATTACK_ENABLE", mon:GetID()) then
return
end
local mainActor = maptools.getActor(SL:GetMetaValue("USER_ID"))
if not mainActor then
return
end
if math.abs(mon:GetMapX() - mainActor:GetMapX()) <= CONST.MAX_ATTACK_DIS and
math.abs(mon:GetMapY() - mainActor:GetMapY()) <= CONST.MAX_ATTACK_DIS then
SL:SubmitForm("飞剑_hit", mID, swordId)
end
end
```
这里使用`SL:SubmitForm("飞剑_hit", mID, swordId)`发送了命中消息。要让怪物攻击你,需要在服务端处理这个消息:
1. **服务端QF脚本中需要添加对应触发**:
```lua
[@飞剑_hit]
#IF
#ACT
; 这里添加让怪物攻击玩家的命令
; 比如使用ChangeTarget命令将怪物目标改为当前玩家
ChangeTarget <$ATTACKMONSTER_NAME> <$USERNAME>
```
2. **前端确保正确触发**:
在你的`handleAttackEnd`函数中已经调用了`FeiJianSKill.sendHitMonster`:
```lua
function FlyingSword:handleAttackEnd()
-- 播放命中特效
if self.target then
maptools.addOrRefreshActorEffect(self.target, hitEffId, 0, 0, 1, 1)
FeiJianSKill.sendHitMonster(self.target, self.swordInfo.id) -- 这里发送命中消息
end
-- 判断是否还有怪物
local monsters = FeiJianSKill.getCanAttackMonster()
if #monsters == 0 then
self:startBack()
else
self.target = monsters[1]:GetID()
self:startAttackWait()
end
end
```
3. **确保怪物在可攻击范围内**:
代码中已经做了距离检查:
```lua
if math.abs(mon:GetMapX() - mainActor:GetMapX()) <= CONST.MAX_ATTACK_DIS and
math.abs(mon:GetMapY() - mainActor:GetMapY()) <= CONST.MAX_ATTACK_DIS then
-- 发送命中消息
end
```
**总结**:
前端代码已经完成了发送命中消息的功能。要让怪物攻击你,关键是在服务端QF脚本中正确处理`飞剑_hit`这个触发,使用相应的命令将怪物仇恨转移到当前玩家身上。这样当飞剑命中怪物时,服务端就会让怪物过来攻击你了。
如果服务端已经配置好了对应的仇恨转移命令,那么你的前端代码不需要修改就能实现这个效果。