PGRData/Script/matrix/xdlcfight/level/common/XAnchorVisualization.lua
2024-09-01 22:49:41 +02:00

153 lines
No EOL
6.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---@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