PGRData/Script/matrix/xdlcfight/level/common/XNpcInteraction.lua

150 lines
4.6 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
---角色交互模块
---@class XNpcInteraction
local XNpcInteraction = XClass(nil, "XNpcInteraction")
local FuncSet = CS.StatusSyncFight.XFightScriptFuncs
--local _interactionSkillNoteKey = 100091
---@param proxy StatusSyncFight.XScriptLuaProxy
---@param npc number
function XNpcInteraction:Ctor(proxy, npc, interactionSkillId)
self._type = 0
self._targetId = 0
self._countTime = 0
self._interactTime = 0
self._interacting = false
self._callback = nil ---@type function
self._npc = npc ---@type number
self._interactionSkillId = interactionSkillId
if self._interactionSkillId <= 0 then
XLog.Error("XNpcInteraction.Ctor error, invalid interaction skill id: " .. tostring(self._interactionSkillId))
return
end
proxy:RegisterNpcEvent(EScriptEvent.NpcExitSkill, self._npc)
self._initialized = true
end
function XNpcInteraction:Update(deltaTime)
if not self._initialized then
return
end
if not self._interacting then
return
end
self._countTime = self._countTime + deltaTime
local progress = self._countTime / self._interactTime
FuncSet.SetInteractionProgress(progress) --更新交互进度到UI
if self._countTime >= self._interactTime then
self._countTime = 0
self:CompleteInteraction()
end
end
---@param eventType number
---@param eventArgs table
function XNpcInteraction:HandleEvent(eventType, eventArgs)
if eventType == EScriptEvent.NpcInteractStart then --Npc开始交互
XLog.Debug(string.format("XNpcInteraction.HandleEvent, launcher:%d try start interact", self._npc))
local interactArgs = eventArgs ---@type StatusSyncFight.InteractEventArgs
self:StartInteraction(interactArgs.TargetId, interactArgs.Time, interactArgs.Type)
elseif eventType == EScriptEvent.NpcExitSkill then
self:OnSkillExit(eventArgs)
end
end
---@param eventArgs StatusSyncFight.SkillScriptEventArgs
function XNpcInteraction:OnSkillExit(eventArgs)
if not self._initialized then
return
end
if not self._interacting then
return
end
--交互中退出交互技能,交互被中断
if eventArgs.LauncherId == self._npc and eventArgs.SkillId == self._interactionSkillId then
self:StopInteraction()
XLog.Debug("XNpcInteraction.OnSkillExit skill was aborted, stop interaction.")
end
end
---@param targetId number
---@param time number @second
---@param type number
---@param callback function
---@return boolean
function XNpcInteraction:StartInteraction(targetId, time, type, callback)
if not self._initialized then
return false
end
if self._interacting then
return false
end
self._targetId = targetId
self._interactTime = time
self._type = type
self._callback = callback
if FuncSet.CastSkill(self._npc, self._interactionSkillId) then
self._interacting = true
else
XLog.Debug(string.format("XNpcInteraction.StartInteraction, launcher:%d cast interact skill failed!", self._npc))
self:Reset()
return false
end
if type == EInteractType.Rescue then
FuncSet.SetNpcRescuedState(self._npc, targetId, true)
end
XLog.Debug(string.format("XNpcInteraction.StartInteraction launcher:%d target:%d", self._npc, targetId))
return true
end
function XNpcInteraction:StopInteraction()
FuncSet.SetInteractionProgress(0) --交互进度清零
if self._type == EInteractType.Rescue then
FuncSet.SetNpcRescuedState(self._npc, self._targetId, false) --关闭被救者的被救援UI
end
self:Reset()
end
function XNpcInteraction:CompleteInteraction()
self._interacting = false --提前修改交互中状态避免下面的结束打断技能被OnSkillExit误认为交互技能中断
FuncSet.AbortSkill(self._npc, true) --打断交互技能交互技能统一配置了非常长的CastTime以保证交互过程中不会被移动打断故此处需要强制打断。
FuncSet.SetInteractionProgress(0) --交互进度清零
FuncSet.NpcInteractComplete(self._npc) --发送消息给关卡逻辑
if self._type == EInteractType.Rescue then
FuncSet.SetNpcRescuedState(self._npc, self._targetId, false) --关闭被救者的被救援UI
end
if self._callback then
self._callback()
end
self:Reset()
XLog.Debug(string.format("XNpcInteraction.CompleteInteraction, launcher:%d target:%d", self._npc, self._targetId))
end
function XNpcInteraction:Reset()
self._targetId = 0
self._type = 0
self._countTime = 0
self._interactTime = 0
self._interacting = false
self._callback = nil
end
return XNpcInteraction