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

153 lines
6.5 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
---@class XAnchorVisualization 锚点可视化
local XAnchorVisualization = XClass(nil, "XAnchorVisualization")
local FuncSet = CS.StatusSyncFight.XFightScriptFuncs
---@param npc number
function XAnchorVisualization:Ctor(npc)
self._npc = npc
self._camLockAnchorIndex = 25003 ---相机选中的勾点
self._anchorUsableIndex = 250030 ---参数存在时,选中的勾点可以勾取
self._anchorVisibleIndex = 250031 ---参数存在时,选中的勾点可以瞄准但不可勾取
self._npcCamLock0Index = 2402 ---两个中任意一个参数存在且非0时角色镜头锁定怪物
self._npcCamLock1Index = 2102
self._camLockAnchor = nil ---相机选中的勾点
self._presentAnchorID = nil ---当前显示进度的勾点
self._presentAnchorVisible = false ---当前是否显示进度
self._anchorUsable = false ---选中的勾点可以勾取
self._anchorVisible = false ---选中的勾点可以瞄准但不可勾取
self._npcCamLock0 = false
self._npcCamLock1 = false ---角色镜头是否锁定怪物
self._maxDistance = 100
self._currentDistanceIndex = 2500201 ---角色到锁定勾点的距离
self._currentDistance = 100
self._triggerDistanceIndex = 2500202 ---锁定勾点配置的触发距离
self._triggerDistance = 100
print("猎矛填充模块上线")
self._initialized = true
end
---@param dt number @ delta time
function XAnchorVisualization:Update(dt)
if not self._initialized then
return
end
--[[ print("读表参数显示"
.. " camLockAnchor: " .. tostring(FuncSet.GetNpcNoteInt(self._npc, self._camLockAnchorIndex))
.. " anchorUsable: ".. tostring(FuncSet.CheckNpcNoteInt(self._npc, self._anchorUsableIndex))
.." anchorVisible: "..tostring(FuncSet.CheckNpcNoteInt(self._npc, self._anchorVisibleIndex))
.." npcCamLock: " .. tostring(FuncSet.GetNpcNoteInt(self._npc, self._npcCamLock0Index)).."&&"..tostring(FuncSet.GetNpcNoteInt(self._npc, self._npcCamLock1Index))
)]]
--- 角色镜头是否锁定怪物判断
self._npcCamLock0 = FuncSet.GetNpcNoteInt(self._npc, self._npcCamLock0Index) ~= 0
self._npcCamLock1 = FuncSet.GetNpcNoteInt(self._npc, self._npcCamLock1Index) ~= 0
if (self._npcCamLock0 or self._npcCamLock1) and self._presentAnchorVisible then
--print("————————————————————需要关闭")
self:DisableAnchorVisible()
return
end
self._anchorUsable = FuncSet.CheckNpcNoteFloat3(self._npc, self._anchorUsableIndex)
self._anchorVisible = FuncSet.CheckNpcNoteFloat3(self._npc, self._anchorVisibleIndex)
self._camLockAnchor = FuncSet.GetNpcNoteInt(self._npc, self._camLockAnchorIndex)
--[[ print("执行参数显示"
.. " camLockAnchor: " .. tostring(self._camLockAnchor)
.. " anchorUsable: " .. tostring(self._anchorUsable)
.. " anchorVisible: " .. tostring(self._anchorVisible)
.. " npcCamLock: " .. tostring(self._npcCamLock0 or self._npcCamLock1)
.. " presentAnchorVisible: " .. tostring(self._presentAnchorVisible)
.. " presentAnchorID: " .. tostring(self._presentAnchorID)
)]]
--- 获取玩家当前和选中勾点的距离
self._currentDistance = FuncSet.GetNpcNoteFloat(self._npc, self._currentDistanceIndex)
if (self._anchorVisible or self._anchorUsable) and not self._presentAnchorVisible then
--- 需要开启
--print("————————————————————需要开启")
self:SetAnchorVisible()
self._maxDistance = self._currentDistance
self._triggerDistance = FuncSet.GetNpcNoteFloat(self._npc, self._triggerDistanceIndex)
elseif not( self._anchorVisible or self._anchorUsable) and self._presentAnchorVisible then
--- 需要关闭
--print("————————————————————需要关闭")
self:DisableAnchorVisible()
elseif self._presentAnchorVisible and self._camLockAnchor ~= self._presentAnchorID then
--- 需要更换目标
--print("————————————————————需要更换目标")
self:ChangeAnchor()
self._maxDistance = self._currentDistance
self._triggerDistance = FuncSet.GetNpcNoteFloat(self._npc, self._triggerDistanceIndex)
end
--[[ print("计算参数显示"
.. " _currentDistance: " .. tostring(self._currentDistance)
.. " _maxDistance: " .. tostring(self._maxDistance)
.. " _triggerDistance: " .. tostring(self._triggerDistance)
)]]
--- 更新填充进度,算法待优化。
if self._presentAnchorVisible then
if self._anchorUsable then
--处于可用范围内
FuncSet.SetSpearPointUiProgress(self._presentAnchorID, 1)
else
--处于可视范围内
if self._currentDistance > self._maxDistance then
self._maxDistance = self._currentDistance
end
local activeDis = self._currentDistance - self._triggerDistance
local maxDis = self._maxDistance - self._triggerDistance
if maxDis < 10 then
maxDis = 10
end
local progress = 1 - activeDis / maxDis
FuncSet.SetSpearPointUiProgress(self._presentAnchorID, progress)
end
end
end
--- 开启锚点填充进度显示
function XAnchorVisualization:SetAnchorVisible()
if self._camLockAnchor ~= 0 then
--print("开启显示")
FuncSet.SetSpearPointUiActive(self._camLockAnchor, true)
self._presentAnchorID = self._camLockAnchor
self._presentAnchorVisible = true
end
end
--- 强制脱出,目标置空,关闭填充
function XAnchorVisualization:DisableAnchorVisible()
--print("关闭显示")
if self._presentAnchorID ~= nil then
FuncSet.SetSpearPointUiActive(self._presentAnchorID, false)
end
self._presentAnchorVisible = false
--print("目标置空")
self._presentAnchorID = nil
end
--- 变更猎矛显示
function XAnchorVisualization:ChangeAnchor()
--print("变更显示")
if self._presentAnchorID ~= nil then
FuncSet.SetSpearPointUiActive(self._presentAnchorID, false)
end
if self._camLockAnchor ~= nil then
FuncSet.SetSpearPointUiActive(self._camLockAnchor, true)
self._presentAnchorID = self._camLockAnchor
end
end
return XAnchorVisualization