forked from endernon/PGRData
608 lines
No EOL
24 KiB
Lua
608 lines
No EOL
24 KiB
Lua
---@class XGoldenMinerSystemHook
|
||
local XGoldenMinerSystemHook = XClass(nil, "XGoldenMinerSystemHook")
|
||
|
||
---@param game XGoldenMinerGame
|
||
function XGoldenMinerSystemHook:Init(game)
|
||
if XTool.IsTableEmpty(game.HookEntityList) then
|
||
return
|
||
end
|
||
|
||
for _, hookEntity in ipairs(game.HookEntityList) do
|
||
self:HookIdle(game, hookEntity.Hook)
|
||
self:ChangeHookRopeLength(hookEntity.Hook, hookEntity.Hook.RopeLength)
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
function XGoldenMinerSystemHook:Update(game, time)
|
||
if XTool.IsTableEmpty(game.HookEntityList) then
|
||
return
|
||
end
|
||
|
||
for _, hookEntity in ipairs(game.HookEntityList) do
|
||
self:UpdateHook(game, hookEntity.Hook, time)
|
||
end
|
||
end
|
||
|
||
--region Hook
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:ChangeHookRopeLength(hook, length)
|
||
if not hook or XTool.IsTableEmpty(hook.RopeObjList) then
|
||
return
|
||
end
|
||
hook.RopeLength = length
|
||
hook.RopeLength = math.max(hook.RopeLength, hook.RopeMinLength)
|
||
hook.RopeLength = math.min(hook.RopeLength, hook.RopeMaxLength)
|
||
local deltaPosition
|
||
|
||
if XTool.IsTableEmpty(hook.CurMoveHitPointLengthList) then
|
||
deltaPosition = Vector3(0, hook.RopeMinLength - hook.RopeLength, 0)
|
||
hook.HookObj.localPosition = hook.HookObjStartLocalPosition + deltaPosition
|
||
for i, rope in ipairs(hook.RopeObjList) do
|
||
if i == 1 then
|
||
rope.sizeDelta = Vector2(rope.sizeDelta.x, hook.RopeLength)
|
||
else
|
||
rope.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
else
|
||
-- 线段起点索引
|
||
local index = 0
|
||
local deltaLength = 0
|
||
for i, hitPointLength in ipairs(hook.CurMoveHitPointLengthList) do
|
||
if hook.RopeLength > hitPointLength then
|
||
index = i + 1
|
||
end
|
||
end
|
||
|
||
if index > 1 then
|
||
local curAngle = hook.CurMoveAngleList[index]
|
||
local curStartPosition = hook.CurMoveStartPointList[index]
|
||
local rotation = CS.UnityEngine.Quaternion.Euler(curAngle)
|
||
deltaLength = hook.RopeLength - hook.CurMoveHitPointLengthList[index - 1]
|
||
deltaPosition = rotation * Vector3.down * deltaLength
|
||
-- 绳子分段创建
|
||
if not hook.RopeObjList[index] then
|
||
hook.RopeObjList[index] = XUiHelper.Instantiate(hook.RopeObjList[1].gameObject, hook.RopeObjList[1].parent).transform
|
||
hook.RopeObjList[index].gameObject:SetActiveEx(false)
|
||
end
|
||
-- 校准绳子角度及位置
|
||
if hook.RopeObjList[index].localPosition ~= curStartPosition + hook.RopeObjStartLocalPosition then
|
||
hook.RopeObjList[index].localPosition = curStartPosition + hook.RopeObjStartLocalPosition
|
||
end
|
||
if hook.RopeObjList[index].localEulerAngles ~= curAngle then
|
||
hook.RopeObjList[index].localEulerAngles = curAngle
|
||
end
|
||
-- 设置绳子长度
|
||
for i, rope in ipairs(hook.RopeObjList) do
|
||
if i == index then
|
||
local connectObj = XUiHelper.TryGetComponent(hook.HookObj, "Shackle")
|
||
local hookPosition = curStartPosition + deltaPosition
|
||
if connectObj then
|
||
hookPosition = hookPosition - connectObj.localPosition
|
||
end
|
||
rope.sizeDelta = Vector2(rope.sizeDelta.x, Vector3.Distance(rope.localPosition, hookPosition) + hook.RopeMinLength)
|
||
rope.gameObject:SetActiveEx(true)
|
||
elseif i < index then
|
||
--因为绳子Obj比钩子Obj坐标超出RopeObjStartLocalPosition
|
||
--校准转角后钩子坐标需要去除这部分坐标
|
||
local l = (hook.CurMoveHitPointLengthList[i]) - (i > 1 and hook.CurMoveHitPointLengthList[i - 1] or hook.RopeObjStartLocalPosition.y)
|
||
rope.sizeDelta = Vector2(rope.sizeDelta.x, math.max(l, hook.RopeMinLength))
|
||
rope.gameObject:SetActiveEx(true)
|
||
elseif i > index then
|
||
rope.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
-- 校准钩子角度及位置
|
||
hook.HookObj.localPosition = curStartPosition + deltaPosition
|
||
if hook.HookObj.localEulerAngles ~= curAngle then
|
||
hook.HookObj.localEulerAngles = curAngle
|
||
end
|
||
else
|
||
deltaPosition = Vector3(0, hook.RopeMinLength - hook.RopeLength, 0)
|
||
hook.HookObj.localPosition = hook.HookObjStartLocalPosition + deltaPosition
|
||
if hook.HookObj.localEulerAngles ~= Vector3.zero then
|
||
hook.HookObj.localEulerAngles = Vector3.zero
|
||
end
|
||
for i, rope in ipairs(hook.RopeObjList) do
|
||
if i == 1 then
|
||
rope.sizeDelta = Vector2(rope.sizeDelta.x, hook.RopeLength)
|
||
rope.gameObject:SetActiveEx(true)
|
||
else
|
||
rope.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
if hook.RopeCollider then
|
||
hook.RopeCollider.transform.position = hook.HookObj.position
|
||
end
|
||
end
|
||
|
||
---设置钩爪为待使用状态
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:HookIdle(game, hook)
|
||
if XTool.IsTableEmpty(game.HookEntityList) and not hook then
|
||
return
|
||
end
|
||
|
||
if hook.Status == XGoldenMinerConfigs.GAME_HOOK_STATUS.REVOKING then
|
||
self:OnHookRevokeToIdle(game, hook)
|
||
end
|
||
self:_SetHookStatus(hook, XGoldenMinerConfigs.GAME_HOOK_STATUS.IDLE)
|
||
|
||
for _, hookEntity in ipairs(game.HookEntityList) do
|
||
if hookEntity.Hook.Status ~= XGoldenMinerConfigs.GAME_HOOK_STATUS.IDLE then
|
||
return
|
||
end
|
||
end
|
||
game.HookEntityStatus = XGoldenMinerConfigs.GAME_HOOK_ENTITY_STATUS.IDLE
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:OnHookRevokeToIdle(game, hook)
|
||
local hookEntity = game:GetHookEntityByHook(hook)
|
||
for _, stoneEntity in ipairs(hookEntity.HookGrabbingStoneList) do
|
||
if stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBING then
|
||
game:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBED)
|
||
hookEntity.HookGrabbedStoneList[#hookEntity.HookGrabbedStoneList + 1] = stoneEntity
|
||
end
|
||
end
|
||
game:OnHookRevokeToIdle(hookEntity)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
function XGoldenMinerSystemHook:HookShoot(game)
|
||
if XTool.IsTableEmpty(game.HookEntityList) then
|
||
return
|
||
end
|
||
if game:IsPause() or game:IsEnd() or game:IsQTE() then
|
||
return
|
||
end
|
||
|
||
if game.HookEntityStatus ~= XGoldenMinerConfigs.GAME_HOOK_ENTITY_STATUS.IDLE then
|
||
return
|
||
end
|
||
game.HookEntityStatus = XGoldenMinerConfigs.GAME_HOOK_ENTITY_STATUS.USING
|
||
|
||
for _, hookEntity in ipairs(game.HookEntityList) do
|
||
self:_SetHookStatus(hookEntity.Hook, XGoldenMinerConfigs.GAME_HOOK_STATUS.SHOOTING)
|
||
end
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_PLAY_FACE,
|
||
XGoldenMinerConfigs.GAME_FACE_PLAY_TYPE.SHOOTING,
|
||
XGoldenMinerConfigs.GAME_FACE_PLAY_ID.SHOOTING)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:HookRevoke(game, hook)
|
||
if XTool.IsTableEmpty(game.HookEntityList) then
|
||
return
|
||
end
|
||
if game:IsPause() or game:IsEnd() or game:IsQTE() then
|
||
return
|
||
end
|
||
if game.HookEntityStatus ~= XGoldenMinerConfigs.GAME_HOOK_ENTITY_STATUS.USING then
|
||
return
|
||
end
|
||
if hook.Status ~= XGoldenMinerConfigs.GAME_HOOK_STATUS.SHOOTING
|
||
and hook.Status ~= XGoldenMinerConfigs.GAME_HOOK_STATUS.GRABBING
|
||
and hook.Status ~= XGoldenMinerConfigs.GAME_HOOK_STATUS.QTE then
|
||
return
|
||
end
|
||
|
||
self:_SetHookStatus(hook, XGoldenMinerConfigs.GAME_HOOK_STATUS.REVOKING)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_PLAY_FACE,
|
||
XGoldenMinerConfigs.GAME_FACE_PLAY_TYPE.REVOKING,
|
||
XGoldenMinerConfigs.GAME_FACE_PLAY_ID.REVOKING)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemHook:HookGrab(game, hook, stoneEntity)
|
||
if XTool.IsTableEmpty(game.HookEntityList) then
|
||
return
|
||
end
|
||
if game:IsPause() or game:IsEnd() then
|
||
return
|
||
end
|
||
if game.HookEntityStatus ~= XGoldenMinerConfigs.GAME_HOOK_ENTITY_STATUS.USING then
|
||
return
|
||
end
|
||
if hook.Status ~= XGoldenMinerConfigs.GAME_HOOK_STATUS.SHOOTING then
|
||
return
|
||
end
|
||
self:_SetHookStatus(hook, XGoldenMinerConfigs.GAME_HOOK_STATUS.GRABBING)
|
||
self:SetStoneEntityOnHook(hook, stoneEntity)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hookEntity XGoldenMinerEntityHook
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemHook:OnHookHit(game, hookEntity, stoneEntity)
|
||
if hookEntity.Hook.Status ~= XGoldenMinerConfigs.GAME_HOOK_STATUS.SHOOTING then
|
||
return
|
||
end
|
||
|
||
if not stoneEntity then
|
||
if XTool.IsTableEmpty(hookEntity.HookGrabbingStoneList) then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_PLAY_FACE,
|
||
XGoldenMinerConfigs.GAME_FACE_PLAY_TYPE.GRAB_NONE,
|
||
XGoldenMinerConfigs.GAME_FACE_PLAY_ID.GRAB_NONE)
|
||
end
|
||
self:HookRevoke(game, hookEntity.Hook)
|
||
return
|
||
end
|
||
|
||
-- 过滤忽略类型
|
||
for _, ignoreType in ipairs(XGoldenMinerConfigs.GetFalculaIgnoreTypeList(hookEntity.Hook.Type)) do
|
||
if ignoreType == stoneEntity.Data:GetType() then
|
||
return
|
||
end
|
||
end
|
||
|
||
-- 河蚌抓过或关闭就过滤
|
||
if stoneEntity.Mussel and
|
||
(stoneEntity.Mussel.IsGrabbed or stoneEntity.Mussel.Status == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.CLOSE)
|
||
then
|
||
self:HookRevoke(game, hookEntity.Hook)
|
||
return
|
||
end
|
||
|
||
-- 状态不对过滤
|
||
if stoneEntity.Status ~= XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE then
|
||
return
|
||
end
|
||
|
||
-- QTE
|
||
if stoneEntity.QTE then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_QTE_START, hookEntity, stoneEntity)
|
||
return
|
||
end
|
||
|
||
-- 钩爪不处理挡板撞击处理
|
||
if stoneEntity.HookDirectionPoint then
|
||
return
|
||
end
|
||
|
||
-- 碰到炸弹直接收回
|
||
if self:_OnHookHitBoom(game, hookEntity, stoneEntity) then
|
||
return
|
||
end
|
||
|
||
-- 碰到炸弹携带者直接收回
|
||
if self:_OnHookHitBoom(game, hookEntity, stoneEntity.CarryStone) then
|
||
return
|
||
end
|
||
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_HOOK_HIT, stoneEntity.Data:GetType())
|
||
if hookEntity.Hook.Type == XGoldenMinerConfigs.FalculaType.Magnetic
|
||
or hookEntity.Hook.Type == XGoldenMinerConfigs.FalculaType.StorePressMagnetic
|
||
then
|
||
if stoneEntity.Mussel then
|
||
game:HookGrab(hookEntity, stoneEntity)
|
||
else
|
||
game:SetStoneGrab(hookEntity, stoneEntity)
|
||
end
|
||
return
|
||
end
|
||
game:HookGrab(hookEntity, stoneEntity)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hookEntity XGoldenMinerEntityHook
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemHook:OnRopeHit(game, hookEntity, stoneEntity)
|
||
if hookEntity.Hook.Status ~= XGoldenMinerConfigs.GAME_HOOK_STATUS.SHOOTING then
|
||
return
|
||
end
|
||
|
||
-- 过滤忽略类型
|
||
for _, ignoreType in ipairs(XGoldenMinerConfigs.GetFalculaIgnoreTypeList(hookEntity.Hook.Type)) do
|
||
if ignoreType == stoneEntity.Data:GetType() then
|
||
return
|
||
end
|
||
end
|
||
|
||
-- 状态不对过滤
|
||
if stoneEntity.Status ~= XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE then
|
||
return
|
||
end
|
||
|
||
-- 挡板撞击处理
|
||
if self:_OnHookHitDirectionPoint(game, hookEntity, stoneEntity) then
|
||
return
|
||
end
|
||
end
|
||
|
||
---撞到挡板
|
||
---@param game XGoldenMinerGame
|
||
---@param hookEntity XGoldenMinerEntityHook
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemHook:_OnHookHitDirectionPoint(game, hookEntity, stoneEntity)
|
||
if not stoneEntity.HookDirectionPoint then
|
||
return false
|
||
end
|
||
if table.indexof(hookEntity.HookHitStoneList, stoneEntity) then
|
||
return true
|
||
end
|
||
|
||
hookEntity.HookHitStoneList[#hookEntity.HookHitStoneList + 1] = stoneEntity
|
||
hookEntity.Hook.CurMoveStartPointList[#hookEntity.Hook.CurMoveStartPointList + 1] = hookEntity.Hook.HookObj.localPosition
|
||
hookEntity.Hook.CurMoveHitPointLengthList[#hookEntity.Hook.CurMoveHitPointLengthList + 1] = hookEntity.Hook.RopeLength
|
||
|
||
-- 转向点此时的角度
|
||
local directionPointAngle = stoneEntity.HookDirectionPoint.AngleList[stoneEntity.HookDirectionPoint.CurAngleIndex]
|
||
-- 钩子的角度修正
|
||
local curAngle = Vector3(0, 0, directionPointAngle + 90) - hookEntity.Hook.CurIdleRotateAngle
|
||
table.insert(hookEntity.Hook.CurMoveAngleList, curAngle)
|
||
|
||
--XGoldenMinerConfigs.DebugLog("撞击挡板,方向改变!角度="
|
||
-- ..stoneEntity.HookDirectionPoint.AngleList[stoneEntity.HookDirectionPoint.CurAngleIndex]
|
||
-- ..",StoneId="..stoneEntity.Data:GetId())
|
||
-- 抓到挡板表情
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_PLAY_FACE,
|
||
XGoldenMinerConfigs.GAME_FACE_PLAY_TYPE.GRAB_STONE,
|
||
XGoldenMinerConfigs.GetStoneTypeGrabFaceId(stoneEntity.Data:GetType()))
|
||
-- 撞到挡板事件
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_HOOK_HIT, stoneEntity.Data:GetType())
|
||
|
||
return true
|
||
end
|
||
|
||
---撞到炸弹
|
||
---@param game XGoldenMinerGame
|
||
---@param hookEntity XGoldenMinerEntityHook
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemHook:_OnHookHitBoom(game, hookEntity, stoneEntity)
|
||
if not stoneEntity or stoneEntity.Data:GetType() ~= XGoldenMinerConfigs.StoneType.Boom then
|
||
return false
|
||
end
|
||
|
||
-- 防爆直接穿过
|
||
if game:CheckHasBuff(XGoldenMinerConfigs.BuffType.GoldenMinerNotActiveBoom) then
|
||
return true
|
||
end
|
||
game:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_DESTROY)
|
||
self:HookRevoke(game, hookEntity.Hook)
|
||
|
||
-- 抓到炸弹表情
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_PLAY_FACE,
|
||
XGoldenMinerConfigs.GAME_FACE_PLAY_TYPE.GRAB_STONE,
|
||
XGoldenMinerConfigs.GetStoneTypeGrabFaceId(stoneEntity.Data:GetType()))
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_HOOK_HIT, stoneEntity.Data:GetType())
|
||
return true
|
||
end
|
||
|
||
---@param hook XGoldenMinerComponentHook
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemHook:SetStoneEntityOnHook(hook, stoneEntity)
|
||
---@type XGoldenMinerEntityStone
|
||
local tempStoneEntity = stoneEntity
|
||
-- 河蚌只抓携带物
|
||
if tempStoneEntity.Mussel then
|
||
tempStoneEntity = stoneEntity.CarryStone
|
||
end
|
||
if not tempStoneEntity or XTool.UObjIsNil(tempStoneEntity.Stone.Transform) then
|
||
return
|
||
end
|
||
tempStoneEntity.Stone.Transform:SetParent(hook.GrabPoint, false)
|
||
local rectTransform = tempStoneEntity.Stone.Transform:GetComponent("RectTransform")
|
||
rectTransform.anchorMin = Vector2(0.5, 1)
|
||
rectTransform.anchorMax = Vector2(0.5, 1)
|
||
rectTransform.pivot = Vector2(0.5, 1)
|
||
|
||
if stoneEntity.Mouse then
|
||
tempStoneEntity.Stone.Transform.localPosition = Vector3(0, XGoldenMinerConfigs.GetMouseGrabOffset(), 0)
|
||
else
|
||
tempStoneEntity.Stone.Transform.localPosition = Vector3.zero
|
||
end
|
||
tempStoneEntity.Stone.Transform.localRotation = CS.UnityEngine.Quaternion.identity
|
||
|
||
if string.IsNilOrEmpty(tempStoneEntity.Data:GetCatchEffect()) or tempStoneEntity.QTE then
|
||
return
|
||
end
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_PLAY_EFFECT,
|
||
XGoldenMinerConfigs.GAME_EFFECT_TYPE.GRAB,
|
||
tempStoneEntity.Stone.Transform,
|
||
tempStoneEntity.Data:GetCatchEffect())
|
||
end
|
||
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:_SetHookStatus(hook, status)
|
||
if hook.Status == status then
|
||
return
|
||
end
|
||
if status == XGoldenMinerConfigs.GAME_HOOK_STATUS.SHOOTING then
|
||
hook.CurMoveStartPointList = {hook.HookObjStartLocalPosition}
|
||
hook.CurMoveHitPointLengthList = {}
|
||
hook.CurMoveAngleList = { Vector3.zero }
|
||
for _, collider in ipairs(hook.ColliderList) do
|
||
collider.enabled = true
|
||
end
|
||
elseif status == XGoldenMinerConfigs.GAME_HOOK_STATUS.GRABBING -- 磁力钩不存在Grabbing状态
|
||
and (hook.Type == XGoldenMinerConfigs.FalculaType.Magnetic
|
||
or hook.Type == XGoldenMinerConfigs.FalculaType.StorePressMagnetic) then
|
||
return
|
||
else
|
||
for _, collider in ipairs(hook.ColliderList) do
|
||
collider.enabled = false
|
||
end
|
||
end
|
||
|
||
hook.Status = status
|
||
end
|
||
--endregion
|
||
|
||
--region Data
|
||
---计算回收速度
|
||
---@param hookEntity XGoldenMinerEntityHook
|
||
---@param buffContainer XGoldenMinerEntityBuffContainer
|
||
---@return number
|
||
function XGoldenMinerSystemHook:ComputeRevokeSpeed(hookEntity)
|
||
local speed
|
||
if not XTool.IsTableEmpty(hookEntity.HookHitStoneList) then
|
||
local hitStoneCount = #hookEntity.HookHitStoneList
|
||
speed = XGoldenMinerConfigs.GetHookHitPointRevokeSpeed(hitStoneCount)
|
||
--XGoldenMinerConfigs.DebugLog("撞到转向点急速回收,撞到转向点数量="..hitStoneCount
|
||
-- ..",初始速度参数="..XGoldenMinerConfigs.GetHookHitPointRevokeSpeed(hitStoneCount))
|
||
else
|
||
speed = XGoldenMinerConfigs.GetRopeShortenSpeed()
|
||
end
|
||
local weight = 0
|
||
local qteSpeedRate = 1
|
||
for _, stoneEntity in pairs(hookEntity.HookGrabbingStoneList) do
|
||
if stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBING then
|
||
weight = weight + stoneEntity.Stone.CurWeight
|
||
end
|
||
if stoneEntity.QTE and stoneEntity.QTE.SpeedRate > qteSpeedRate then
|
||
qteSpeedRate = stoneEntity.QTE.SpeedRate
|
||
--XGoldenMinerConfigs.DebugLog("QTE回收,速度倍率="..qteSpeedRate)
|
||
end
|
||
end
|
||
local param = weight + XGoldenMinerConfigs.GetShortenSpeedParameter()
|
||
param = XTool.IsNumberValid(param) and param or 1
|
||
speed = speed * (1 - (weight / param)) * hookEntity.Hook.CurRevokeSpeedPercent * qteSpeedRate
|
||
--XGoldenMinerConfigs.DebugLog("当前钩爪回收速度="..speed)
|
||
return math.max(speed, XGoldenMinerConfigs.GetShortenMinSpeed())
|
||
end
|
||
--endregion
|
||
|
||
--region Update
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:UpdateHook(game, hook, time)
|
||
if not hook then
|
||
return
|
||
end
|
||
if hook.Status == XGoldenMinerConfigs.GAME_HOOK_STATUS.IDLE then
|
||
self:_UpdateHookIdle(game, hook, time)
|
||
elseif hook.Status == XGoldenMinerConfigs.GAME_HOOK_STATUS.READY then
|
||
self:_UpdateHookReady(game, hook, time)
|
||
elseif hook.Status == XGoldenMinerConfigs.GAME_HOOK_STATUS.SHOOTING then
|
||
self:_UpdateHookShooting(game, hook, time)
|
||
elseif hook.Status == XGoldenMinerConfigs.GAME_HOOK_STATUS.GRABBING then
|
||
self:_UpdateHookGrab(game, hook, time)
|
||
elseif hook.Status == XGoldenMinerConfigs.GAME_HOOK_STATUS.REVOKING then
|
||
self:_UpdateHookRevoking(game, hook, time)
|
||
elseif hook.Status == XGoldenMinerConfigs.GAME_HOOK_STATUS.QTE then
|
||
self:_UpdateHookQTE(game, hook, time)
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:_UpdateHookIdle(game, hook, time)
|
||
for _, aim in pairs(hook.AimTranList) do
|
||
aim.gameObject:SetActiveEx(hook.IsAim)
|
||
end
|
||
-- 存在一个钩子还在出钩状态就不摇晃
|
||
if game.HookEntityStatus ~= XGoldenMinerConfigs.GAME_HOOK_ENTITY_STATUS.IDLE then
|
||
return
|
||
end
|
||
-- 待机摇晃
|
||
local leftRangeAngle, rightRangeAngle = XGoldenMinerConfigs.GetHookIdleAngleRange()
|
||
if hook.Type == XGoldenMinerConfigs.FalculaType.Normal
|
||
or hook.Type == XGoldenMinerConfigs.FalculaType.Magnetic
|
||
or hook.Type == XGoldenMinerConfigs.FalculaType.Big
|
||
or hook.Type == XGoldenMinerConfigs.FalculaType.StorePressMagnetic then
|
||
-- 自由摇晃
|
||
if not hook.IdleRotateDirection then
|
||
hook.IdleRotateDirection = Vector3.forward
|
||
end
|
||
if hook.CurIdleRotateAngle.z <= leftRangeAngle then
|
||
hook.IdleRotateDirection = Vector3.forward
|
||
elseif hook.CurIdleRotateAngle.z >= rightRangeAngle then
|
||
hook.IdleRotateDirection = Vector3.back
|
||
end
|
||
local deltaAngle = hook.IdleRotateDirection * hook.IdleSpeed * time
|
||
hook.CurIdleRotateAngle = hook.CurIdleRotateAngle + deltaAngle
|
||
hook.Transform:Rotate(deltaAngle)
|
||
elseif hook.Type == XGoldenMinerConfigs.FalculaType.Double then
|
||
-- 钩子2与钩子1对称摇晃
|
||
---@type XGoldenMinerComponentHook
|
||
local tempHook = false
|
||
-- 找到钩子1
|
||
for _, hookEntity in ipairs(game.HookEntityList) do
|
||
if hook ~= hookEntity.Hook then
|
||
tempHook = hookEntity.Hook
|
||
end
|
||
end
|
||
if not tempHook then
|
||
return
|
||
end
|
||
-- 对称摇晃
|
||
local rotateAngleZ = (rightRangeAngle - tempHook.CurIdleRotateAngle.z) + leftRangeAngle
|
||
hook.CurIdleRotateAngle = Vector3(tempHook.CurIdleRotateAngle.x, tempHook.CurIdleRotateAngle.y, rotateAngleZ)
|
||
hook.Transform.localEulerAngles = hook.CurIdleRotateAngle
|
||
elseif hook.Type == XGoldenMinerConfigs.FalculaType.AimingAngle then
|
||
-- 没有控制方向退出
|
||
if not hook.IdleRotateDirection then
|
||
return
|
||
end
|
||
-- 到达左右边界不再移动
|
||
if hook.IdleRotateDirection == Vector3.forward and hook.CurIdleRotateAngle.z >= rightRangeAngle
|
||
or hook.IdleRotateDirection == Vector3.back and hook.CurIdleRotateAngle.z <= leftRangeAngle then
|
||
return
|
||
end
|
||
hook.CurIdleRotateAngle = hook.CurIdleRotateAngle + hook.IdleRotateDirection * hook.IdleSpeed * time
|
||
if hook.CurIdleRotateAngle.z <= leftRangeAngle then
|
||
hook.CurIdleRotateAngle = Vector3(hook.CurIdleRotateAngle.x, hook.CurIdleRotateAngle.y, leftRangeAngle)
|
||
elseif hook.CurIdleRotateAngle.z >= rightRangeAngle then
|
||
hook.CurIdleRotateAngle = Vector3(hook.CurIdleRotateAngle.x, hook.CurIdleRotateAngle.y, rightRangeAngle)
|
||
end
|
||
hook.Transform.localEulerAngles = hook.CurIdleRotateAngle
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:_UpdateHookReady(game, hook, time)
|
||
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:_UpdateHookShooting(game, hook, time)
|
||
local shootSpeed = hook.CurShootSpeed
|
||
hook.RopeLength = hook.RopeLength + time * shootSpeed
|
||
self:ChangeHookRopeLength(hook, hook.RopeLength)
|
||
|
||
if hook.RopeLength >= hook.RopeMaxLength then
|
||
self:HookRevoke(game, hook)
|
||
end
|
||
|
||
for _, aim in pairs(hook.AimTranList) do
|
||
aim.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:_UpdateHookGrab(game, hook, time)
|
||
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:_UpdateHookRevoking(game, hook, time)
|
||
local hookEntity = game:GetHookEntityByHook(hook)
|
||
local revokeSpeed = self:ComputeRevokeSpeed(hookEntity, game.BuffContainer)
|
||
hook.RopeLength = hook.RopeLength - time * revokeSpeed
|
||
self:ChangeHookRopeLength(hook, hook.RopeLength)
|
||
if hook.RopeLength == hook.RopeMinLength then
|
||
self:HookIdle(game, hook)
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param hook XGoldenMinerComponentHook
|
||
function XGoldenMinerSystemHook:_UpdateHookQTE(game, hook, time)
|
||
|
||
end
|
||
--endregion
|
||
|
||
return XGoldenMinerSystemHook |