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