forked from endernon/PGRData
561 lines
No EOL
23 KiB
Lua
561 lines
No EOL
23 KiB
Lua
---@class XGoldenMinerSystemStone
|
||
local XGoldenMinerSystemStone = XClass(nil, "XGoldenMinerSystemStone")
|
||
|
||
---@param game XGoldenMinerGame
|
||
function XGoldenMinerSystemStone:Init(game)
|
||
local stoneList = game.StoneEntityList
|
||
local usedTime = game:GetData() and game:GetData():GetUsedTime() or 0
|
||
if XTool.IsTableEmpty(stoneList) then
|
||
return
|
||
end
|
||
for _, stoneEntity in ipairs(stoneList) do
|
||
-- 初始化基础参数
|
||
self:ComputeStoneScore(stoneEntity)
|
||
stoneEntity.Stone.Weight = self:ComputeStoneWeight(stoneEntity)
|
||
stoneEntity.Stone.CurWeight = stoneEntity.Stone.Weight
|
||
self:CheckStoneStatusTime(stoneEntity, usedTime, 0)
|
||
self:UpdateStone(game, stoneEntity, 0)
|
||
self:CheckStoneStatusTime(stoneEntity, usedTime, 0)
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
function XGoldenMinerSystemStone:Update(game, time)
|
||
local stoneList = game.StoneEntityList
|
||
local usedTime = game:GetData() and game:GetData():GetUsedTime() or 0
|
||
if XTool.IsTableEmpty(stoneList) then
|
||
return
|
||
end
|
||
-- 时间停止则不处理延时问题
|
||
if game:IsTimeStop() then
|
||
time = 0
|
||
end
|
||
for _, stoneEntity in ipairs(stoneList) do
|
||
self:UpdateStone(game, stoneEntity, time)
|
||
self:CheckStoneStatusTime(stoneEntity, usedTime, time)
|
||
end
|
||
end
|
||
|
||
--region Data - Compute
|
||
---计算抓取物分数
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
---@return number
|
||
function XGoldenMinerSystemStone:ComputeStoneWeight(stoneEntity)
|
||
local weight = 0
|
||
weight = self:_GetStoneWeight(stoneEntity)
|
||
if stoneEntity.CarryStone then
|
||
weight = weight + self:_GetStoneWeight(stoneEntity.CarryStone)
|
||
end
|
||
return weight
|
||
end
|
||
|
||
---计算抓取物分数
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:ComputeStoneScore(stoneEntity)
|
||
stoneEntity.Stone.Score = self:_GetStoneScore(stoneEntity)
|
||
stoneEntity.Stone.CurScore = stoneEntity.Stone.Score
|
||
if stoneEntity.CarryStone then
|
||
stoneEntity.CarryStone.Stone.Score = self:_GetStoneScore(stoneEntity.CarryStone)
|
||
stoneEntity.CarryStone.Stone.CurScore = stoneEntity.CarryStone.Stone.Score
|
||
end
|
||
end
|
||
|
||
---@return number
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_GetStoneScore(stoneEntity)
|
||
local score = 0
|
||
if stoneEntity.Data:GetType() == XGoldenMinerConfigs.StoneType.RedEnvelope then
|
||
local redEnvelopeGroup = stoneEntity.Data:GetRedEnvelopeGroup()
|
||
local redEnvelopeId = stoneEntity.AdditionValue[XGoldenMinerConfigs.StoneType.RedEnvelope]
|
||
if not redEnvelopeId then
|
||
stoneEntity.AdditionValue[XGoldenMinerConfigs.StoneType.RedEnvelope] = XGoldenMinerConfigs.GetRedEnvelopeRandId(redEnvelopeGroup)
|
||
redEnvelopeId = stoneEntity.AdditionValue[XGoldenMinerConfigs.StoneType.RedEnvelope]
|
||
end
|
||
score = XGoldenMinerConfigs.GetRedEnvelopeScore(redEnvelopeId)
|
||
else
|
||
score = stoneEntity.Data:GetScore()
|
||
end
|
||
return score
|
||
end
|
||
|
||
---@return number
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_GetStoneWeight(stoneEntity)
|
||
local weight = 0
|
||
if stoneEntity.Data:GetType() == XGoldenMinerConfigs.StoneType.RedEnvelope then
|
||
local redEnvelopeGroup = stoneEntity.Data:GetRedEnvelopeGroup()
|
||
local redEnvelopeId = stoneEntity.AdditionValue[XGoldenMinerConfigs.StoneType.RedEnvelope]
|
||
if not redEnvelopeId then
|
||
stoneEntity.AdditionValue[XGoldenMinerConfigs.StoneType.RedEnvelope] = XGoldenMinerConfigs.GetRedEnvelopeRandId(redEnvelopeGroup)
|
||
redEnvelopeId = stoneEntity.AdditionValue[XGoldenMinerConfigs.StoneType.RedEnvelope]
|
||
end
|
||
weight = XGoldenMinerConfigs.GetRedEnvelopeHeft(redEnvelopeId)
|
||
else
|
||
weight = stoneEntity.Data:GetWeight()
|
||
end
|
||
return weight
|
||
end
|
||
--endregion
|
||
|
||
--region Stone - Hit
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
---@param beHitStoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:OnStoneHit(stoneEntity, beHitStoneEntity)
|
||
if not beHitStoneEntity then
|
||
return
|
||
end
|
||
-- 自己不处于Alive和Grabbing状态不处理碰撞
|
||
if stoneEntity.Status ~= XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE
|
||
and stoneEntity.Status ~= XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBING
|
||
then
|
||
return
|
||
end
|
||
|
||
-- 撞上炸弹
|
||
if beHitStoneEntity.Data:GetType() == XGoldenMinerConfigs.StoneType.Boom then
|
||
self:_OnStoneHitBoom(stoneEntity, beHitStoneEntity)
|
||
end
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
---@param beHitStoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_OnStoneHitBoom(stoneEntity, beHitStoneEntity)
|
||
-- 炸弹如果不是将爆炸不管
|
||
if beHitStoneEntity.Status ~= XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_DESTROY then
|
||
return
|
||
end
|
||
|
||
-- 河蚌被炸
|
||
if stoneEntity.Mussel then
|
||
self:SetMusselBeBoom(stoneEntity)
|
||
return
|
||
end
|
||
|
||
-- 定春被炸
|
||
if stoneEntity.Mouse then
|
||
self:SetMouseBeBoom(stoneEntity)
|
||
return
|
||
end
|
||
|
||
-- 如果不会被炸毁不管
|
||
if not stoneEntity.Data:IsBoomDestroy() then
|
||
return
|
||
end
|
||
self:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_DESTROY)
|
||
end
|
||
--endregion
|
||
|
||
--region Update - Stone
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:CheckStoneStatusTime(stoneEntity, usedTime, time)
|
||
if stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.NONE
|
||
or stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_ALIVE
|
||
then
|
||
if stoneEntity.Stone.BornDelayTime > 0 and stoneEntity.Stone.BornDelayTime > usedTime then
|
||
self:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_ALIVE)
|
||
else
|
||
self:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE)
|
||
end
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE then
|
||
if stoneEntity.Stone.AutoDestroyTime > 0 and stoneEntity.Stone.AutoDestroyTime <= usedTime then
|
||
self:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.DESTROY)
|
||
end
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBING then
|
||
return
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBED then
|
||
return
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.HIDE then
|
||
stoneEntity.Stone.HideTime = stoneEntity.Stone.HideTime - time
|
||
if stoneEntity.Stone.HideTime <= 0 then
|
||
self:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE)
|
||
end
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_DESTROY then
|
||
if stoneEntity.Mussel then
|
||
return
|
||
end
|
||
stoneEntity.Stone.BeDestroyTime = stoneEntity.Stone.BeDestroyTime - time
|
||
if stoneEntity.Stone.BeDestroyTime <= 0 then
|
||
self:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.DESTROY)
|
||
end
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.DESTROY then
|
||
return
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:UpdateStone(game, stoneEntity, time)
|
||
if stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.NONE then
|
||
return
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_ALIVE then
|
||
self:_UpdateStoneBeAlive(game, stoneEntity, time)
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE then
|
||
self:_UpdateStoneAlive(game, stoneEntity, time)
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBING then
|
||
self:_UpdateStoneGrabbing(game, stoneEntity, time)
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBED then
|
||
self:_UpdateStoneGrabbed(game, stoneEntity, time)
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.HIDE then
|
||
self:_UpdateStoneHide(game, stoneEntity, time)
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_DESTROY then
|
||
self:_UpdateStoneBeDestroy(game, stoneEntity, time)
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.DESTROY then
|
||
self:_UpdateStoneDestroy(game, stoneEntity, time)
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_UpdateStoneBeAlive(game, stoneEntity, time)
|
||
self:SetStoneEntityTransform(stoneEntity, false)
|
||
self:SetStoneEntityCollider(stoneEntity, false)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_UpdateStoneAlive(game, stoneEntity, time)
|
||
self:SetStoneEntityTransform(stoneEntity, true)
|
||
self:SetStoneEntityCollider(stoneEntity, true)
|
||
|
||
self:SetMouseAlive(stoneEntity)
|
||
|
||
self:UpdateMusselTime(stoneEntity, time)
|
||
self:UpdateHookDirectionPointTime(stoneEntity, time)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_UpdateStoneGrabbing(game, stoneEntity, time)
|
||
self:SetStoneEntityTransform(stoneEntity, true)
|
||
self:SetStoneEntityCollider(stoneEntity, true)
|
||
|
||
-- 河蚌被抓去也能开闭
|
||
self:UpdateMusselTime(stoneEntity, time)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_UpdateStoneGrabbed(game, stoneEntity, time)
|
||
if stoneEntity.Mussel then
|
||
-- 河蚌被抓去也能开闭
|
||
self:SetStoneEntityTransform(stoneEntity, true)
|
||
self:SetStoneEntityCollider(stoneEntity, true)
|
||
self:UpdateMusselTime(stoneEntity, time)
|
||
else
|
||
self:SetStoneEntityTransform(stoneEntity, false)
|
||
self:SetStoneEntityCollider(stoneEntity, false)
|
||
end
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_UpdateStoneHide(game, stoneEntity, time)
|
||
self:SetStoneEntityTransform(stoneEntity, false)
|
||
self:SetStoneEntityCollider(stoneEntity, false)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_UpdateStoneBeDestroy(game, stoneEntity, time)
|
||
self:SetStoneEntityTransform(stoneEntity, true)
|
||
self:SetStoneEntityCollider(stoneEntity, false)
|
||
|
||
self:OnMouseDestroy(stoneEntity)
|
||
self:UpdateMusselTime(stoneEntity, time)
|
||
end
|
||
|
||
---@param game XGoldenMinerGame
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:_UpdateStoneDestroy(game, stoneEntity, time)
|
||
self:SetStoneEntityTransform(stoneEntity, false)
|
||
self:SetStoneEntityCollider(stoneEntity, false)
|
||
end
|
||
|
||
---抓取物状态改变
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
---@param status number XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS
|
||
function XGoldenMinerSystemStone:SetStoneEntityStatus(stoneEntity, status)
|
||
if not stoneEntity or stoneEntity.Status == status then
|
||
return
|
||
end
|
||
if status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE then
|
||
elseif status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_ALIVE then
|
||
|
||
elseif status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBING then
|
||
self:SetMusselGrabbing(stoneEntity)
|
||
self:SetMouseGrabbing(stoneEntity)
|
||
elseif status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBED then
|
||
elseif status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.HIDE then
|
||
elseif status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_DESTROY then
|
||
self:SetBoomBeDestroy(stoneEntity)
|
||
|
||
-- 定春被炸
|
||
self:SetMouseBeBoomDestroy(stoneEntity)
|
||
|
||
if stoneEntity.Stone.BeDestroyTime <= 0 and not stoneEntity.Mussel then
|
||
self:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.DESTROY)
|
||
return
|
||
end
|
||
elseif status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.DESTROY then
|
||
end
|
||
stoneEntity.Status = status
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetStoneEntityTransform(stoneEntity, active)
|
||
if stoneEntity.Stone.Transform then
|
||
stoneEntity.Stone.Transform.gameObject:SetActiveEx(active)
|
||
end
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetStoneEntityCollider(stoneEntity, active)
|
||
if stoneEntity.Stone.Collider and not XTool.UObjIsNil(stoneEntity.Stone.Collider) then
|
||
stoneEntity.Stone.Collider.enabled = active
|
||
end
|
||
if stoneEntity.Stone.GoInputHandler then
|
||
stoneEntity.Stone.GoInputHandler.enabled = active
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
--region Stone - Mouse
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:OnMouseDestroy(stoneEntity)
|
||
if not stoneEntity.Mouse or not stoneEntity.Mouse.IsBoom then
|
||
return
|
||
end
|
||
local curBazierPoint = XTool.GetBezierPoint((stoneEntity.Mouse.BoomTime - stoneEntity.Stone.BeDestroyTime) / stoneEntity.Mouse.BoomTime,
|
||
stoneEntity.Mouse.BoomStartPos,
|
||
stoneEntity.Mouse.BoomBezierControlPoint,
|
||
stoneEntity.Mouse.BoomEndPos)
|
||
stoneEntity.Stone.Transform.localPosition = curBazierPoint
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetMouseBeBoom(stoneEntity)
|
||
if not stoneEntity.Mouse then
|
||
return
|
||
end
|
||
stoneEntity.Mouse.IsBoom = true
|
||
self:SetStoneEntityStatus(stoneEntity, XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_DESTROY)
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetMouseBeBoomDestroy(stoneEntity)
|
||
if not stoneEntity.Mouse or not stoneEntity.Mouse.IsBoom then
|
||
return
|
||
end
|
||
stoneEntity.Stone.BeDestroyTime = stoneEntity.Mouse.BoomTime
|
||
local screen = CS.UnityEngine.Screen
|
||
--随机左右边界
|
||
local endPosX = math.random(0, 1) == 1 and screen.width or 0
|
||
stoneEntity.Mouse.BoomStartPos = stoneEntity.Stone.Transform.localPosition
|
||
stoneEntity.Mouse.BoomEndPos = Vector3(endPosX, stoneEntity.Stone.Transform.localPosition.y, stoneEntity.Stone.Transform.localPosition.z)
|
||
--中间点,起点和终点的向量相加乘0.5,再加一个高度
|
||
stoneEntity.Mouse.BoomBezierControlPoint = (stoneEntity.Stone.Transform.localPosition + stoneEntity.Mouse.BoomEndPos) * 0.5 + (Vector3.up * 400)
|
||
|
||
self:SetMouseStatus(stoneEntity.Mouse, XGoldenMinerConfigs.GAME_MOUSE_STATE.BOOM)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_PLAY_EFFECT,
|
||
XGoldenMinerConfigs.GAME_EFFECT_TYPE.STONE_BOOM,
|
||
stoneEntity.Stone.Transform,
|
||
stoneEntity.Data:GetCatchEffect())
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetMouseGrabbing(stoneEntity)
|
||
if not stoneEntity.Mouse then
|
||
return
|
||
end
|
||
|
||
if stoneEntity.Stone.Transform.rotation ~= CS.UnityEngine.Quaternion.identity then
|
||
stoneEntity.Stone.Transform.rotation = CS.UnityEngine.Quaternion.identity
|
||
end
|
||
self:SetMouseStatus(stoneEntity.Mouse, XGoldenMinerConfigs.GAME_MOUSE_STATE.GRABBING)
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetMouseAlive(stoneEntity)
|
||
if not stoneEntity.Mouse then
|
||
return
|
||
end
|
||
self:SetMouseStatus(stoneEntity.Mouse, XGoldenMinerConfigs.GAME_MOUSE_STATE.ALIVE)
|
||
end
|
||
|
||
---@param mouse XGoldenMinerComponentMouse
|
||
function XGoldenMinerSystemStone:SetMouseStatus(mouse, toStatus)
|
||
if not mouse or mouse.Status == toStatus then
|
||
return
|
||
end
|
||
for status, trans in pairs(mouse.StateTrans) do
|
||
trans.gameObject:SetActiveEx(status == toStatus)
|
||
end
|
||
local oldCarryParent = mouse.CarryPoint[mouse.Status]
|
||
local newCarryParent = mouse.CarryPoint[toStatus]
|
||
if oldCarryParent and newCarryParent and oldCarryParent.childCount > 0 then
|
||
for i = oldCarryParent.childCount - 1, 0, -1 do
|
||
oldCarryParent:GetChild(i):SetParent(newCarryParent, false)
|
||
end
|
||
end
|
||
mouse.Status = toStatus
|
||
end
|
||
--endregion
|
||
|
||
--region Stone - Boom
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetBoomBeDestroy(stoneEntity)
|
||
if stoneEntity.Data:GetType() ~= XGoldenMinerConfigs.StoneType.Boom then
|
||
return
|
||
end
|
||
local RawImg = stoneEntity.Stone.Transform:GetComponent("RawImage")
|
||
if stoneEntity.Stone.BoomCollider then
|
||
stoneEntity.Stone.BoomCollider.enabled = true
|
||
end
|
||
if RawImg then
|
||
RawImg.enabled = false
|
||
end
|
||
stoneEntity.Stone.BeDestroyTime = 0.5
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GOLDEN_MINER_GAME_PLAY_EFFECT,
|
||
XGoldenMinerConfigs.GAME_EFFECT_TYPE.STONE_BOOM,
|
||
stoneEntity.Stone.Transform,
|
||
stoneEntity.Data:GetCatchEffect())
|
||
end
|
||
--endregion
|
||
|
||
--region Stone - Mussel
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:UpdateMusselTime(stoneEntity, time)
|
||
if not stoneEntity.Mussel or not time then
|
||
return
|
||
end
|
||
-- 永久暴露便不再计时
|
||
if not stoneEntity.Mussel.CanHide then
|
||
if stoneEntity.Mussel.Status == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.CLOSE then
|
||
self:SetMusselStatus(stoneEntity.Mussel, XGoldenMinerConfigs.GAME_MUSSEL_STATUS.OPEN)
|
||
end
|
||
self:CheckMusselCarryStatus(stoneEntity)
|
||
return
|
||
end
|
||
stoneEntity.Mussel.CurTime = stoneEntity.Mussel.CurTime - time
|
||
if stoneEntity.Mussel.Status == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.OPEN then
|
||
if stoneEntity.Mussel.CurTime <= 0 then
|
||
self:SetMusselStatus(stoneEntity.Mussel, XGoldenMinerConfigs.GAME_MUSSEL_STATUS.CLOSE)
|
||
stoneEntity.Mussel.CurTime = stoneEntity.Mussel.HideTime
|
||
--XGoldenMinerConfigs.DebugLog("河蚌关闭:id=".. stoneEntity.Data:GetId())
|
||
end
|
||
elseif stoneEntity.Mussel.Status == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.CLOSE then
|
||
if stoneEntity.Mussel.CurTime <= 0 then
|
||
self:SetMusselStatus(stoneEntity.Mussel, XGoldenMinerConfigs.GAME_MUSSEL_STATUS.OPEN)
|
||
stoneEntity.Mussel.CurTime = stoneEntity.Mussel.OpenTime
|
||
--XGoldenMinerConfigs.DebugLog("河蚌开启:id=".. stoneEntity.Data:GetId())
|
||
end
|
||
end
|
||
|
||
self:CheckMusselCarryStatus(stoneEntity)
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetMusselBeBoom(stoneEntity)
|
||
if not stoneEntity.Mussel then
|
||
return
|
||
end
|
||
stoneEntity.Mussel.CanHide = false
|
||
self:SetMusselStatus(stoneEntity.Mussel, XGoldenMinerConfigs.GAME_MUSSEL_STATUS.OPEN)
|
||
self:SetStoneEntityTransform(stoneEntity.CarryStone, false)
|
||
--XGoldenMinerConfigs.DebugLog("河蚌不再闭合:id=".. stoneEntity.Data:GetId())
|
||
end
|
||
|
||
---@param mussel XGoldenMinerComponentMussel
|
||
function XGoldenMinerSystemStone:SetMusselStatus(mussel, state)
|
||
if mussel.Status == state then
|
||
return
|
||
end
|
||
if mussel.AnimOpen then
|
||
mussel.OpenCollider.gameObject:SetActiveEx(state == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.OPEN)
|
||
mussel.CloseCollider.gameObject:SetActiveEx(state == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.CLOSE)
|
||
mussel.AnimOpen.gameObject:SetActiveEx(state == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.OPEN)
|
||
mussel.AnimClose.gameObject:SetActiveEx(state == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.CLOSE)
|
||
end
|
||
mussel.Status = state
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:SetMusselGrabbing(stoneEntity)
|
||
if not stoneEntity.Mussel then
|
||
return
|
||
end
|
||
stoneEntity.Mussel.IsGrabbed = true
|
||
--XGoldenMinerConfigs.DebugLog("河蚌携带物被抓取:id=".. stoneEntity.Data:GetId())
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:CheckMusselCarryStatus(stoneEntity)
|
||
if not stoneEntity.Mussel or not stoneEntity.CarryStone then
|
||
return
|
||
end
|
||
|
||
if stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBING then
|
||
self:SetStoneEntityTransform(stoneEntity.CarryStone, stoneEntity.Mussel.IsGrabbed)
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.GRABBED
|
||
or stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.BE_DESTROY
|
||
or stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.DESTROY
|
||
then
|
||
self:SetStoneEntityTransform(stoneEntity.CarryStone, false)
|
||
elseif stoneEntity.Status == XGoldenMinerConfigs.GAME_GRAB_OBJ_STATUS.ALIVE then
|
||
-- 河蚌本身状态
|
||
if stoneEntity.Mussel.Status == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.OPEN then
|
||
self:SetStoneEntityTransform(stoneEntity.CarryStone, not stoneEntity.Mussel.IsGrabbed)
|
||
elseif stoneEntity.Mussel.Status == XGoldenMinerConfigs.GAME_MUSSEL_STATUS.CLOSE then
|
||
self:SetStoneEntityTransform(stoneEntity.CarryStone, stoneEntity.Mussel.IsGrabbed or false)
|
||
end
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
--region Stone - HookDirectionPoint
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:UpdateHookDirectionPointTime(stoneEntity, time)
|
||
if not stoneEntity.HookDirectionPoint or not time then
|
||
return
|
||
end
|
||
stoneEntity.HookDirectionPoint.CurTime = stoneEntity.HookDirectionPoint.CurTime - time
|
||
local angleListCount = #stoneEntity.HookDirectionPoint.AngleList
|
||
if stoneEntity.HookDirectionPoint.CurTime <= 0 and angleListCount > 1 then
|
||
local index = stoneEntity.HookDirectionPoint.CurAngleIndex
|
||
index = index + 1
|
||
if angleListCount < index then
|
||
index = 1
|
||
end
|
||
stoneEntity.HookDirectionPoint.CurAngleIndex = index
|
||
stoneEntity.HookDirectionPoint.CurTime = stoneEntity.HookDirectionPoint.AngleTimeList[index]
|
||
--XGoldenMinerConfigs.DebugLog("转向点转向:角度="..stoneEntity.HookDirectionPoint.AngleList[index]
|
||
-- ..",持续时间="..stoneEntity.HookDirectionPoint.AngleTimeList[index]
|
||
-- ..",StoneId="..stoneEntity.Data:GetId())
|
||
end
|
||
if stoneEntity.HookDirectionPoint.FillImage then
|
||
if angleListCount > 1 then
|
||
local timeLimit = stoneEntity.HookDirectionPoint.AngleTimeList[stoneEntity.HookDirectionPoint.CurAngleIndex]
|
||
stoneEntity.HookDirectionPoint.FillImage.fillAmount = 1 - stoneEntity.HookDirectionPoint.CurTime / timeLimit
|
||
else
|
||
stoneEntity.HookDirectionPoint.FillImage.fillAmount = 1
|
||
end
|
||
end
|
||
self:CheckHookDirectionPointAngle(stoneEntity)
|
||
end
|
||
|
||
---@param stoneEntity XGoldenMinerEntityStone
|
||
function XGoldenMinerSystemStone:CheckHookDirectionPointAngle(stoneEntity)
|
||
if not stoneEntity.HookDirectionPoint then
|
||
return
|
||
end
|
||
local index = stoneEntity.HookDirectionPoint.CurAngleIndex
|
||
if stoneEntity.HookDirectionPoint.AngleTransform.localEulerAngles.z ~= stoneEntity.HookDirectionPoint.AngleList[index] then
|
||
stoneEntity.HookDirectionPoint.AngleTransform.localEulerAngles = Vector3(
|
||
stoneEntity.HookDirectionPoint.AngleTransform.localEulerAngles.x,
|
||
stoneEntity.HookDirectionPoint.AngleTransform.localEulerAngles.y,
|
||
stoneEntity.HookDirectionPoint.AngleList[index])
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
return XGoldenMinerSystemStone |