forked from endernon/PGRData
608 lines
24 KiB
Lua
608 lines
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
|