--- 开关 local XSObjSwitch = XDlcScriptManager.RegSceneObjScript(0007, "XSObjSwitch") --调用使用冒号 local FuncSet = CS.StatusSyncFight.XFightScriptFuncs --调用使用句号 local Property = require("XDLCFight/Level/Common/SceneObjectsProperty").Switch ---@param proxy StatusSyncFight.XScriptLuaProxy function XSObjSwitch:Ctor(proxy) self._proxy = proxy ---触发事件 self._triggerHandler = { func = nil, param = nil, executeTimes = 0 } self._options = {} self.EnableOnStart = true self._enable = nil self._type = 22 self._coolDownCount = 0 self._latestAction = nil self._initialized = false ---是否执行开关的初始化 end function XSObjSwitch:Init() self._sceneObj = self._proxy:GetSceneObject() self._sceneObjPlaceId = self._proxy:GetSceneObjectPlaceId() self._proxy:RegisterSceneObjectTriggerEvent(self._sceneObjPlaceId, 1) self._proxy:RegisterSceneObjectEvent(EScriptEvent.SceneObjectActionFinish, self._sceneObjPlaceId) end ---@param dt number @ delta time function XSObjSwitch:Update(dt) if not self._initialized then return end if self._enable == false and self._options.autoReboot and not (self._options.triggerTimes > 0 and self._triggerHandler.executeTimes >= self._options.triggerTimes ) then if self._coolDownCount >= self._options.autoRebootCoolDown then -- reboot self:SetEnable(true) self._coolDownCount = 0 end self._coolDownCount = self._coolDownCount + dt end end ---设置开关是否启用 ---@param enable boolean @ 如果不输入,则根据self._enable来切换 function XSObjSwitch:SetEnable(enable) if enable == nil then return false end if self._latestAction ~= nil then --避免动画中硬切 return false end --表现相关 if enable ~= self._enable then XLog.Debug("[SceneObject]设置开关" .. self._sceneObjPlaceId .. "状态为:" .. tostring(enable)) self._enable = enable --表现相关 if enable then FuncSet.DoSceneObjectAction(self._sceneObjPlaceId, Property.Actions[self._type].Open) self._latestAction = Property.Actions[self._type].Open else FuncSet.DoSceneObjectAction(self._sceneObjPlaceId, Property.Actions[self._type].Close) self._latestAction = Property.Actions[self._type].Close end end end ---注册触发事件 ---@param object table @ 触发事件的表 ---@param func function @ 触发的事件 ---@param param @ 传入的参数 function XSObjSwitch:SetTriggerHandler(object, func, param) self._triggerHandler.object = object self._triggerHandler.func = func self._triggerHandler.param = param XLog.Debug("[SceneObject]注册开关" .. tostring(self._sceneObjPlaceId) .. " 事件成功:" .. " eventFunc " .. tostring(func) .. " param " .. tostring(param) ) end ---注销触发事件 function XSObjSwitch:DeleteTriggerHandler() self._triggerHandler.func = nil end ---被触发 function XSObjSwitch:OnTrigger() if self._options.triggerTimes > 0 and self._triggerHandler.executeTimes >= self._options.triggerTimes then return end if self._triggerHandler.func == nil then XLog.Debug("[SceneObject]触发失败,开关" .. tostring(self._sceneObjPlaceId) .. "未注册事件!") return end self._triggerHandler.func(self._triggerHandler.object, self._triggerHandler.param) self._triggerHandler.executeTimes = self._triggerHandler.executeTimes + 1 XLog.Debug("[SceneObject] 开关" .. tostring(self._sceneObjPlaceId) .. "注册事件触发成功,剩余触发次数:" .. tostring(self._options.triggerTimes > 0 and (self._options.triggerTimes - self._triggerHandler.executeTimes) or "无限") ) self._latestAction = Property.Actions[self._type].Trigger self._enable = false FuncSet.DoSceneObjectAction(self._sceneObjPlaceId, Property.Actions[self._type].Trigger) end ---@param eventType number ---@param eventArgs userdata function XSObjSwitch:HandleEvent(eventType, eventArgs) XSObjSwitch.Super.HandleEvent(self, eventType, eventArgs) if eventType == EScriptEvent.SceneObjectTrigger then XLog.Debug("[SceneObject]XSObjSwitch SceneObjectTriggerEvent:" .. " TouchType " .. tostring(eventArgs.TouchType) .. " SourceActorId " .. tostring(eventArgs.SourceActorId) .. " SceneObjectId " .. tostring(eventArgs.SceneObjectId) .. " TriggerId " .. tostring(eventArgs.TriggerId) .. " TriggerState " .. tostring(eventArgs.TriggerState) .. " Log自开关" .. tostring(self._sceneObjPlaceId) ) --可能需要加一下是玩家触发的判断 if self._enable then self:OnTrigger() end elseif eventType == EScriptEvent.SceneObjectActionFinish then XLog.Debug("[SceneObject]场景物体动作结束:" .. tostring(eventArgs.SceneObjectId) .. " " .. tostring(eventArgs.ActionId)) if eventArgs._sceneObjectId == self.SceneObjectId then self._latestAction = nil if eventArgs.ActionId == Property.Actions[self._type].Open then XLog.Debug("[SceneObject]开关开启动作执行完毕") FuncSet.DoSceneObjectAction(self._sceneObjPlaceId, Property.Actions[self._type].OpenIdle) end end end end ---初始化状态,设置开关初始状态 function XSObjSwitch:InitState(enable) if enable == nil then enable = Property.Options.defaultOnEnable end self._enable = enable if enable then FuncSet.DoSceneObjectAction(self._sceneObjPlaceId, Property.Actions[self._type].OpenIdle) else FuncSet.DoSceneObjectAction(self._sceneObjPlaceId, Property.Actions[self._type].Close) end self._initialized = true end ---设置开关配置数据,数据为空则不更改默认配置 function XSObjSwitch:SetOptions(autoReboot, autoRebootCoolDown, triggerTimes) if autoReboot ~= nil then self._options.autoReboot = autoReboot else self._options.autoReboot = Property.Options.autoReboot end if autoRebootCoolDown ~= nil then self._options.autoRebootCoolDown = autoRebootCoolDown else self._options.autoRebootCoolDown = Property.Options.autoRebootCoolDown end if triggerTimes ~= nil then self._options.triggerTimes = triggerTimes self._triggerHandler.executeTimes = 0 else self._options.triggerTimes = Property.Options.triggerTimes end end function XSObjSwitch:Terminate() end function XSObjSwitch:OnResLoadComplete() if not self._initialized then self:InitState(self.EnableOnStart) self:SetOptions() self._initialized = true end end return XSObjSwitch