--时间缩放 local TimeScaleSystem = {} local private = {} local LuaConst=LuaConst local FP=FP local _tsTempV1 = FP.newV1(1) local _tsTemp2V1 = FP.newV1(1) local _tsTemp3V1 = FP.newV1(1) local pairs=pairs --[[ Tick --]] function TimeScaleSystem.OnLogicUpdate(entity) local comp_TimeScale = entity.components.timeScale --计时 local needChangeScale = false local ignoreSound = false local count = 0 local timeScaleChannel = nil for id, updateData in pairs(comp_TimeScale.AddTimeScaleList) do if updateData.Time > 0 then updateData.Time = updateData.Time - LuaConst.TimeSpanMs if updateData.Time <= 0 and updateData.Actived then needChangeScale = true updateData.Actived = false count = count + 1 local curIgnoreSound = updateData.BreakType == LuaConst.TimeScaleBreakType.HitFly or updateData.BreakType == LuaConst.TimeScaleBreakType.HitBreak if count == 1 then ignoreSound = curIgnoreSound end ignoreSound = ignoreSound and curIgnoreSound if timeScaleChannel == nil then timeScaleChannel = updateData.TimeScaleChannel elseif timeScaleChannel ~= updateData.TimeScaleChannel then --这里为了方便,如果出现了多channel的情况,就刷新所有channel timeScaleChannel = LuaConst.ETimeScaleChannel.ALL end end end end if needChangeScale then SystemManager.OnRefreshTimeScale(comp_TimeScale, entity ,ignoreSound,timeScaleChannel) end end --[[ 添加时间缩放 --]] function TimeScaleSystem.AddTimeScale(entity, id, scale, time, breakType,timeScaleChannel) local comp_TimeScale = entity.components.timeScale timeScaleChannel = timeScaleChannel or LuaConst.ETimeScaleChannel.ALL comp_TimeScale.AddTimeScaleList[id] = { Actived = true, AddTimeScale = scale, Time = time, BreakType = breakType, TimeScaleChannel = timeScaleChannel, } local ignoreSound = breakType == LuaConst.TimeScaleBreakType.HitBreak or breakType == LuaConst.TimeScaleBreakType.HitFly SystemManager.OnRefreshTimeScale(comp_TimeScale,entity ,ignoreSound,timeScaleChannel) end --[[ 删去时间缩放 --]] function TimeScaleSystem.DeleteTimeScale(entity, id) local comp_TimeScale = entity.components.timeScale if comp_TimeScale.AddTimeScaleList[id] == nil then return end local breakType = comp_TimeScale.AddTimeScaleList[id].BreakType local timeScaleChannel = comp_TimeScale.AddTimeScaleList[id].TimeScaleChannel local ignoreSound = breakType == LuaConst.TimeScaleBreakType.HitBreak or breakType == LuaConst.TimeScaleBreakType.HitFly comp_TimeScale.AddTimeScaleList[id] = nil SystemManager.OnRefreshTimeScale(comp_TimeScale,entity,ignoreSound,timeScaleChannel) end function TimeScaleSystem.DeleteAllTimeScale(entity) local addTimeScaleList = entity.components.timeScale.AddTimeScaleList -- 【???】这个玩意明明是个Dic,不知道为啥要命名为List。而且key是数字和string混合的 if addTimeScaleList then local sortedIdList = {} for k,v in pairs(addTimeScaleList) do sortedIdList[#sortedIdList + 1] = k end table.sort(sortedIdList, function(a,b) return tostring(a) < tostring(b) --AddTimeScaleList的key是数字和string混合的 end) for i,id in ipairs(sortedIdList) do TimeScaleSystem.DeleteTimeScale(entity, id) end end end --[[ ]]-- function TimeScaleSystem.OnBreakTimeScale(entity, toBreak, breakType) local comp_TimeScale = entity.components.timeScale local needChangeScale = false if toBreak then needChangeScale = private.DoBreakTimeScale(comp_TimeScale, breakType) else needChangeScale = private.CancelBreakTimeScale(comp_TimeScale, breakType) end if needChangeScale then local ignoreSound = breakType == LuaConst.TimeScaleBreakType.HitBreak or breakType == LuaConst.TimeScaleBreakType.HitFly SystemManager.OnRefreshTimeScale(comp_TimeScale,entity ,ignoreSound,LuaConst.ETimeScaleChannel.ALL) end end --[[ 时间缩放真实生效 --]] function TimeScaleSystem.ExecuteChangeTimeScale(comp_TimeScale, addScale) _tsTempV1:Reset(1) _tsTemp2V1:Reset(1)--LuaConst.ETimeScaleChannel.ALL的timeScale _tsTemp3V1:Reset(1)--LuaConst.ETimeScaleChannel.ALL的timeScale for key,addData in pairs(comp_TimeScale.AddTimeScaleList) do if addData.Actived then if addData.TimeScaleChannel == LuaConst.ETimeScaleChannel.ALL then --预期不会再有细分了 _tsTempV1:Mul(addData.AddTimeScale) _tsTemp2V1:Mul(addData.AddTimeScale) _tsTemp3V1:Mul(addData.AddTimeScale) elseif addData.TimeScaleChannel == LuaConst.ETimeScaleChannel.MISSILE or addData.TimeScaleChannel == LuaConst.ETimeScaleChannel.EFFECT then _tsTemp2V1:Mul(addData.AddTimeScale) elseif addData.TimeScaleChannel == LuaConst.ETimeScaleChannel.SKILL_ANIM_SOUND_ENTITY_POS_ROT then _tsTemp3V1:Mul(addData.AddTimeScale) end end end comp_TimeScale:ResetCurTimeScale(_tsTempV1) comp_TimeScale:ResetMissileTimeScale(_tsTemp2V1) comp_TimeScale:ResetEffectTimeScale(_tsTemp2V1) comp_TimeScale:ResetSkillAnimSoundEntityPosRotTimeScale(_tsTemp3V1) end function private.DoBreakTimeScale(comp_TimeScale, breakType) local needChangeScale = false for id,addData in pairs( comp_TimeScale.AddTimeScaleList) do if addData.Actived and addData.BreakType == breakType then addData.Actived = false needChangeScale = true end end return needChangeScale end function private.CancelBreakTimeScale(comp_TimeScale, breakType) local needChangeScale = false for k,addData in pairs( comp_TimeScale.AddTimeScaleList) do if (not addData.Actived) and addData.Time >= 0 and addData.BreakType == breakType then addData.Actived = true; needChangeScale = true; end end return needChangeScale end return TimeScaleSystem