local LevelEventAction = class("LevelEventAction") local ipairs=ipairs local FP=FP local LuaConst=LuaConst local table = table function LevelEventAction:initialize(action, group, event) self.Data = action self._groupBelong = group --行为组 self._eventBelong = event self._actionTimer = FP.newV1(0) end function LevelEventAction:OnStart() if not self.Data then return end self._actionTimer:Reset(self.Data.DelayTime) self._curLeftTimes = self.Data.RepeatTimes if self.Data.RandomCount then self._randomIndexList = {} self._monsterRandomItemIDList = {} end self:TryAction() end function LevelEventAction:OnUpdate() if not self.Data then return end self._actionTimer:Sub(LuaConst.TimeSpan) self:TryAction() end function LevelEventAction:OnDestroy() self.Data = nil self._eventBelong = nil self._groupBelong = nil self._actionTimer = nil self._curLeftTimes = nil self._randomIndexList = nil self._monsterRandomItemIDList = nil end function LevelEventAction:DoAction() if self.Data.ItemIDList then if self.Data.RandomCount then if self.Data.Type == LuaConst.LevelActionType.Monster_Active and self.Data.Param2 then -- 怪物元素的随机逻辑有特殊逻辑 for _, itemID in ipairs(self:MonsterRandomItemID()) do self:DoItemAction(itemID) end else for _, itemID in self:RandomItemID() do self:DoItemAction(itemID) end end else for _, itemID in ipairs(self.Data.ItemIDList) do self:DoItemAction(itemID) end end else self:DoItemAction(LuaConst.GlobalItemID) end end function LevelEventAction:DoItemAction(itemID) local item = LevelItemManager.GetItemByID(itemID) if item then item:DoAction(self.Data.Type,self.Data.Match,self.Data.Param1,self.Data.Param2,self._groupBelong.Context,self.Data.Param3) else logging.error(LTAG.ERROR, "事件:", self._eventBelong._eventData.EventID, "的行为没有找到元素:", itemID) end end function LevelEventAction:RandomItemIDIter(i) local count = #self.Data.ItemIDList while true do if i >= self.Data.RandomCount then table.clearArray(self._randomIndexList) break end local value = LogicRandom.GetIntegerValue(nil, 1, count ,5155) if not table.containValue(self._randomIndexList,value) then table.insert(self._randomIndexList,value) i = i + 1 return i, self.Data.ItemIDList[value] end end end -- 怪物元素的随机逻辑,新增是否从未激活元素中随机 function LevelEventAction:MonsterRandomItemID() -- Clear Table table.clearArray(self._monsterRandomItemIDList) -- Copy Table for _, itemID in ipairs(self.Data.ItemIDList) do local item = LevelItemManager.GetItemByID(itemID) if not item.IsActive then table.insert(self._monsterRandomItemIDList, itemID) end end -- Shuffle Table local rand, temp for i = #self._monsterRandomItemIDList, 1, -1 do rand = LogicRandom.GetIntegerValue(nil, 1, i) temp = self._monsterRandomItemIDList[i] self._monsterRandomItemIDList[i] = self._monsterRandomItemIDList[rand] self._monsterRandomItemIDList[rand] = temp end -- Remove Extra Table local count = #self._monsterRandomItemIDList for i = self.Data.RandomCount + 1, count do table.remove(self._monsterRandomItemIDList) end return self._monsterRandomItemIDList end function LevelEventAction:RandomItemID() return self.RandomItemIDIter,self,0 end function LevelEventAction:TryAction() if self._actionTimer > FP.Const.Zero then return end self._curLeftTimes = self._curLeftTimes -1 self:DoAction() if not self.Data then --有些行为可能会使自己被Destroy,所以添加判空 return end if self._curLeftTimes <= 0 then local eventBelong = self._eventBelong local groupBelong = self._groupBelong self:OnDestroy() table.removebyvalue(groupBelong.ActionList, self) eventBelong:OnActionDone(groupBelong) else self._actionTimer:Reset(self.Data.DelayTime) end end return LevelEventAction