local ConditionType = LuaConst.LevelConditionType local ConditionHandle = {} local handle = ConditionHandle local EventSystem = require('Event/EventSystem') local LuaConst_LevelShapeType = LuaConst.LevelShapeType local FP_IsDistanceGreater = FP.V2.IsDistanceGreater local FP_IsInRectRange = FP.V2.IsInRectRange local match = {} --region --***************condition event***************-- function ConditionHandle.RegisterEvent(condition) local data = condition.Data if data.ItemIDList then for _, itemId in ipairs(data.ItemIDList) do local key = itemId .. '_' .. data.Type EventSystem.Regist(key, condition.OnMessage, condition) local item = LevelItemManager.GetItemByID(itemId) if item then item:HandleCondition(data.Type, data.ParamID, data.Param1, data.Param2, data.Param3) else if condition._eventBelong then logging.error(LTAG.ERROR, "事件:", condition._eventBelong._eventData.EventID , "的条件存在未配置的元素:", itemId) end end end else local key = LuaConst.GlobalItemID .. '_' .. data.Type EventSystem.Regist(key, condition.OnMessage, condition) local item = LevelItemManager.GetItemByID(LuaConst.GlobalItemID) item:HandleCondition(data.Type,data.ParamID, data.Param1, data.Param2, data.Param3) end end function ConditionHandle.UnregisterEvent(condition) local data = condition.Data if data.ItemIDList then for _,itemId in ipairs(data.ItemIDList) do local key = itemId .. '_' .. data.Type EventSystem.UnRegist(key,condition.OnMessage,condition) end else local key = LuaConst.GlobalItemID .. '_' .. data.Type EventSystem.UnRegist(key,condition.OnMessage,condition) end end function ConditionHandle.ClearCondition(condition) condition.value = nil condition.count = nil condition.denominator = nil condition.molecule = nil condition.entityDict = nil end --endregion condition event --region --***************match func***************-- function match.MatchID(condition, id) return not condition.Data.ParamID or id == condition.Data.ParamID end --endregion match func --region --***************condition handles***************-- function ConditionHandle.IncreaseNotLess(condition, value) if not condition.value then condition.value = 0 end local addValue = value or 1 condition.value = condition.value + addValue return addValue > 0 and condition.value >= condition.Data.Param1 end function ConditionHandle.IncreaseNotLessPlayerCount(condition, value) if not condition.value then condition.value = 0 end local addValue = value or 1 condition.value = condition.value + addValue return condition.value >= LevelPlayerManager.GetValidPlayerCount() end function ConditionHandle.DecreaseNotGreater(condition, value) if not condition.value then condition.value = 0 end local addValue = value or 1 condition.value = condition.value + addValue return addValue < 0 and condition.value <= condition.Data.Param1 end function ConditionHandle.InAndDecreaseNotGreater(condition, value) if not condition.value then condition.value = 0 end if value then condition.value = condition.value + value else condition.value = condition.value - 1 end return condition.value <= condition.Data.Param1 end function ConditionHandle.CheckNotLess(condition, value) return value >= condition.Data.Param1 end function ConditionHandle.CheckNotLess_MatchID(condition, value, id) if match.MatchID(condition, id) then return handle.CheckNotLess(condition, value) end end function ConditionHandle.CheckNotGreater(condition, value) return value <= condition.Data.Param1 end function ConditionHandle.CheckHPPercent(condition,entity,maxValue,deltaValue) if not condition.count then condition.count = 0 end if not condition.denominator then condition.denominator = 0 end if not condition.molecule then condition.molecule = 0 end if not condition.entityDict then condition.entityDict = {} end if maxValue then if condition.count < condition.Data.Param1 then condition.count = condition.count + 1 condition.denominator = condition.denominator + maxValue condition.molecule = condition.molecule + deltaValue condition.entityDict[entity] = true end else if condition.entityDict[entity] then condition.molecule = condition.molecule + deltaValue if condition.count == condition.Data.Param1 then local percent = condition.denominator == 0 and 0 or condition.molecule/condition.denominator return FP.GreaterEquals(condition.Data.Param2, percent) end end end end function ConditionHandle.CheckHPPercent_MatchID(condition, id, entity, maxValue, deltaValue) if match.MatchID(condition, id) then return handle.CheckHPPercent(condition,entity,maxValue,deltaValue) end end function ConditionHandle.CheckEqual(condition, value) return value == condition.Data.Param1 end function ConditionHandle.CheckEqual_MatchID(condition, id, value) if match.MatchID(condition, id) then return handle.CheckEqual(condition,value) end end function ConditionHandle.CheckValue(condition, value) return value end function ConditionHandle.CheckValue_MatchID(condition, id, value) if match.MatchID(condition, id) then return handle.CheckValue(condition,value) end end function ConditionHandle.CheckIncreaseNotLess_MatchID(condition, id, value) if match.MatchID(condition, id) then return handle.IncreaseNotLess(condition, value) end end function ConditionHandle.CheckDistance(condition,value) local param = condition.Data.Param1 if param.ShapeType == LuaConst_LevelShapeType.Circle then return not FP_IsDistanceGreater(value, param.Pos, param.Radius) elseif param.ShapeType == LuaConst_LevelShapeType.Square then return FP_IsInRectRange(value, param.Pos, param.Dir, param.Length, param.Width) end end function ConditionHandle.CheckDistance_MatchID(condition, id, value) if match.MatchID(condition, id) then return handle.CheckDistance(condition,value) end end function ConditionHandle.RecordAndCheckNotLess(condition, value) condition.value = value return value >= condition.Data.Param1 end function ConditionHandle.RecordAndMinusOneOrGreater(condition, value) condition.value = value return value == -1 or value > condition.Data.Param1 end function ConditionHandle.CheckSAValue(condition, id, value) if not condition.value then condition.value = { } end local valueCheck = condition.value[id] if not valueCheck then valueCheck = FP.newV1(0) condition.value[id] = valueCheck end valueCheck:Add(value) if valueCheck < FP.Const.Zero then valueCheck:Reset() end for i, v in pairs(condition.value) do if v < condition.Data.Param1[i] then return false end end return true end function ConditionHandle.CheckLogicEventValue(condition, eventType, eventState) return condition.Data.Param1 == eventType and condition.Data.Param2 == eventState; end -- 所有此元素的entity ,都进入到圈内 function ConditionHandle.CheckDistance_AllLevelItemEntity(condition, id, itemList) for _,itemID in ipairs(itemList) do local item = LevelItemManager.GetItemByID(itemID, LuaConst.LevelItemType.Monster) if item then local entityDic = item:GetAllMonsterEntity() -- entityDic 目前安全 : LevelItem_Monster中的_allEntityDict ,以后需要与其一起改为List for eid, entity in pairs(entityDic) do local isIn = handle.CheckDistance(condition, entity.components.move.LogicPos) if isIn == false then return false end end end end return true end -- 所有此元素的entity ,任一进入到圈内 function ConditionHandle.CheckDistance_AnyLevelItemEntity(condition, id, itemList) for _,itemID in ipairs(itemList) do local item = LevelItemManager.GetItemByID(itemID, LuaConst.LevelItemType.Monster) if item then local entityDic = item:GetAllMonsterEntity() -- entityDic 目前安全 : LevelItem_Monster中的_allEntityDict ,以后需要与其一起改为List for eid, entity in pairs(entityDic) do local isIn = handle.CheckDistance(condition, entity.components.move.LogicPos) if isIn == true then return true end end end end return false end --endregion condition handles --全局元素条件 handle[ConditionType.Global_PlayerDeadTimes] = handle.CheckNotLess_MatchID handle[ConditionType.Global_AllMonsterAliveNum] = handle.IncreaseNotLess handle[ConditionType.Global_PlayerReachArea] = handle.CheckDistance handle[ConditionType.Global_GivenMonsterReachArea] = handle.CheckDistance_MatchID handle[ConditionType.Global_TimeRemain] = handle.CheckNotGreater handle[ConditionType.Global_TimeRun] = handle.CheckNotLess handle[ConditionType.Global_GivenMonsterAliveNum] = handle.CheckIncreaseNotLess_MatchID handle[ConditionType.Global_MovieEnd] = handle.CheckEqual handle[ConditionType.Global_GuideEnd] = handle.CheckEqual handle[ConditionType.Global_TimeLineEnd] = handle.CheckEqual handle[ConditionType.Global_DialogueEnd] = handle.CheckEqual handle[ConditionType.Global_SlowMotionEnd] = handle.CheckEqual handle[ConditionType.Global_LevelWaveReach] = handle.RecordAndMinusOneOrGreater handle[ConditionType.Global_GivenMonsterRemainHPPct] = handle.CheckHPPercent_MatchID handle[ConditionType.Global_ReceiveLevelMessage] = handle.CheckEqual handle[ConditionType.Global_ReceiveServerMessage] = handle.CheckEqual handle[ConditionType.Global_PlayerSAIncrease] = handle.CheckSAValue handle[ConditionType.Global_ReceiveLogicEvent] = handle.CheckLogicEventValue handle[ConditionType.Global_HasNextLevel] = handle.CheckEqual handle[ConditionType.Global_HeroKillNums] = handle.CheckNotLess handle[ConditionType.Global_PackageType] = handle.CheckEqual handle[ConditionType.Global_GivenMonsterAllReachArea] = handle.CheckDistance_AllLevelItemEntity handle[ConditionType.Global_GivenMonsterAnyReachArea] = handle.CheckDistance_AnyLevelItemEntity --怪物元素条件 handle[ConditionType.Monster_DeadAll] = handle.IncreaseNotLess handle[ConditionType.Monster_RemainNum] = handle.DecreaseNotGreater handle[ConditionType.Monster_RemainHPPct] = handle.CheckHPPercent handle[ConditionType.Monster_AliveNum] = handle.IncreaseNotLess --trigger元素条件 handle[ConditionType.Trigger_Stay] = handle.CheckNotLess handle[ConditionType.Trigger_PlayerStayNumber] = handle.IncreaseNotLessPlayerCount --mission元素条件 handle[ConditionType.Mission_TimeRun] = handle.RecordAndCheckNotLess handle[ConditionType.Mission_WaveReach] = handle.RecordAndMinusOneOrGreater --stronghold元素条件 handle[ConditionType.StrongHold_UpdateOccupy] = handle.CheckEqual --通用条件 handle[ConditionType.DeadNumber] = handle.CheckIncreaseNotLess_MatchID handle[ConditionType.ReceiveAI] = handle.CheckEqual_MatchID handle[ConditionType.CollectNumber] = handle.CheckIncreaseNotLess_MatchID handle[ConditionType.InteractNumber] = handle.CheckIncreaseNotLess_MatchID --region --***************context analyzer**************-- local function TriggerAnalyzer(sourceContext, targetContext) if sourceContext.HasExecutors() then table.clearArray(targetContext.ExecutorIDs) for i, v in sourceContext.IterExecutors() do table.insert(targetContext.ExecutorIDs,v) end end end local function EntityDeadAnalyzer(sourceContext, targetContext) targetContext.CoveredKillerID = sourceContext.GetCoveredKillerID() or targetContext.CoveredKillerID end local function TriggerTimeLineEndAnalyzer(sourceContext, targetContext) targetContext.IsSkipTimeLine = sourceContext end local contextAnalyzer = { [ConditionType.Trigger_Enter] = TriggerAnalyzer, [ConditionType.Trigger_Exit] = TriggerAnalyzer, [ConditionType.Trigger_Stay] = TriggerAnalyzer, [ConditionType.DeadNumber] = EntityDeadAnalyzer, [ConditionType.Monster_DeadAll] = EntityDeadAnalyzer, [ConditionType.Global_MonsterDeadAll] = EntityDeadAnalyzer, [ConditionType.WaitingZone_Complete] = TriggerAnalyzer, [ConditionType.Global_TimeLineEnd] = TriggerTimeLineEndAnalyzer, } function ConditionHandle.GetContextAnalyzer() return contextAnalyzer end --endregion context analyzer return ConditionHandle