---@class XLevelScript0013 13关本地脚本,暂时在角色这里跑 local XLevelScriptHunt01 = XClass(nil, "XLevelScriptHunt01") local FuncSet = CS.StatusSyncFight.XFightScriptFuncs local TowerConfig = require("XDLCFight/Level/LevelConfig/Hunt01BossFightConfig").Towers -- 读取场景物体的配置数据 local Tool = require("XDLCFight/Level/Common/XLevelTools") local Timer = require("XDLCFight/Level/Common/XTaskScheduler") ---@param proxy StatusSyncFight.XScriptLuaProxy ---@param npc number function XLevelScriptHunt01:Ctor(proxy, npc) self._proxy = proxy self._timer = Timer.New() self._levelConfirmed = false ---是否确实是这关 self._npc = npc self._boss = nil self._camLockAnchorIndex = 25003 ---相机选中的勾点 self._npcCamLock0Index = 2402 ---两个中任意一个参数存在且非0时,角色镜头锁定怪物 self._npcCamLock1Index = 2102 self._npcCamLock0 = false self._npcCamLock1 = false ---角色镜头是否锁定怪物 self._bossLockTrigger = 17 ---boss等待区域,用于开关玩家自动锁定boss的判断 self._playerInBossLockTrigger = false self._bossLockTriggerRegistered = false self._towerLandTriggerRegistered = false self._jumpFunStarted = false self._levelSigh = 599013 self._jumpFunStartSign = 5990130 self._fakeFinishSign = 5990140 self._removeFakeFinish = 5990141 self._playerFocusAnchor = nil self._playerLandTower = nil self._closeFightUISign = 5000007 self._FightUIActive = true self._currentLevelId = FuncSet.GetCurrentLevelId() if self._currentLevelId == 0013 or self._currentLevelId == 0014 or self._currentLevelId == 0015 or self._currentLevelId == 0016 then self._levelConfirmed = true XLog.Debug("[SceneHunt01 BOSS战本地模块]" .. tostring(self._currentLevelId) .. "关玩家本地模块上线") self._initialized = true end --[[ self._proxy:RegisterNpcEvent(EDlcScriptEvent.NpcCastSkill, self._npc) self._proxy:RegisterNpcEvent(EDlcScriptEvent.NpcExitSkill, self._npc)]] end function XLevelScriptHunt01:Update(dt) if not self._initialized then return end if not self._levelConfirmed then return end self._timer:Update(dt) if self._currentLevelId == 0013 or self._currentLevelId == 0014 or self._currentLevelId == 0016 then if not self._jumpFunStarted then if FuncSet.CheckBuffByKind(self._npc, self._jumpFunStartSign) then -- 跳跳乐开始 XLog.Debug("[黑龙BOSS战本地模块]玩家" .. tostring(self._npc) .. "跳跳乐模块已开启") FuncSet.ShowTip(13002) self._jumpFunStarted = true if not self._bossLockTriggerRegistered then self._proxy:RegisterSceneObjectTriggerEvent(self._bossLockTrigger, 1) --boss停留在场地中央等待的区域检测 self._bossLockTriggerRegistered = true end if not self._towerLandTriggerRegistered then for _, tower in pairs(TowerConfig) do self._proxy:RegisterSceneObjectTriggerEvent(tower.placeId, 3) end -- 注册所有塔的SpearUnusableTrigger的监听,用来作为玩家是否在塔之上的判断条件之一 self._towerLandTriggerRegistered = true end FuncSet.SetNpcNoteInt(self._npc, 2400, 2) --禁用锁定怪物 FuncSet.SetNpcNoteFloat(self._npc, 40000, 60) --关卡专用QTE时长 FuncSet.RemoveNpcFocusTarget(self._npc) --解除锁定 self._allNpc = FuncSet.GetNpcList() for _, v in pairs(self._allNpc) do if FuncSet.GetNpcCamp(v) == 2 then self._boss = v break end end end elseif not FuncSet.CheckBuffByKind(self._npc, self._jumpFunStartSign) then -- 跳跳乐结束 XLog.Debug("[黑龙BOSS战本地模块]玩家" .. tostring(self._npc) .. "跳跳乐模块已关闭") self._jumpFunStarted = false FuncSet.SetNpcNoteInt(self._npc, 2400, 0) end end if self._currentLevelId == 0014 then if FuncSet.CheckBuffByKind(self._npc, self._fakeFinishSign) then XLog.Debug("[黑龙BOSS战本地模块]玩家" .. tostring(self._npc) .. "出示健康码,开始装模做样") FuncSet.ApplyMagic(self._npc, self._npc, self._removeFakeFinish, 1) self:FakeLevelFinish() self._timer:Schedule(4, true, FuncSet.SetFakeSettleActive) self._timer:Schedule(8, false, FuncSet.SetFakeSettleActive) end end if not self._FightUIActive then if not FuncSet.CheckBuffByKind(self._npc, self._closeFightUISign) then Tool.SetFightUiActive(true) XLog.Debug("[黑龙BOSS战本地模块]玩家" .. tostring(self._npc) .. "开启FightUI") self._FightUIActive = true end elseif self._FightUIActive then if FuncSet.CheckBuffByKind(self._npc, self._closeFightUISign) then Tool.SetFightUiActive(false) XLog.Debug("[黑龙BOSS战本地模块]玩家" .. tostring(self._npc) .. "关闭FightUI") self._FightUIActive = false end end end ---@param eventType number ---@param eventArgs userdata function XLevelScriptHunt01:HandleEvent(eventType, eventArgs) --[[ if eventType == EDlcScriptEvent.SceneObjectTrigger then print("XLevelBossFight1 SceneObjectTriggerEvent:" .. " TouchType " .. tostring(eventArgs.TouchType) .. " SourceActorId " .. tostring(eventArgs.SourceActorId) .. " SceneObjectId " .. tostring(eventArgs.SceneObjectId) .. " TriggerId " .. tostring(eventArgs.TriggerId) .. " TriggerState " .. tostring(eventArgs.TriggerState) .. " Log自角色的关卡模块" ) end]] if not self._levelConfirmed then return end if not self._jumpFunStarted then return end if eventType == EScriptEvent.SceneObjectTrigger and eventArgs.SourceActorId == self._npc then if eventArgs.SceneObjectId == self._bossLockTrigger then if eventArgs.TriggerState == 1 then --XLog.Debug("[黑龙BOSS战本地模块]进入自动锁范围,解锁玩家锁定怪物限制") self._playerInBossLockTrigger = true FuncSet.SetNpcNoteInt(self._npc, 2400, 0) elseif eventArgs.TriggerState == 2 then --XLog.Debug("[黑龙BOSS战本地模块]退出自动锁范围,限制玩家锁定怪物") self._playerInBossLockTrigger = false FuncSet.RemoveNpcFocusTarget(self._npc) FuncSet.SetNpcNoteInt(self._npc, 2400, 2) end elseif eventArgs.TriggerState == ESceneObjectTriggerState.Enter and eventArgs.TriggerId == 3 then XLog.Debug("[黑龙BOSS战本地模块]玩家进入塔" .. eventArgs.SceneObjectId) self._playerLandTower = eventArgs.SceneObjectId elseif eventArgs.TriggerState == ESceneObjectTriggerState.Exit and eventArgs.TriggerId == 3 then XLog.Debug("[黑龙BOSS战本地模块]玩家退出塔" .. eventArgs.SceneObjectId) self._playerLandTower = nil end elseif eventType == EScriptEvent.NpcCastSkill and eventArgs.LauncherId == self._npc then --角色使用猎矛 if eventArgs.SkillId == 100241 or eventArgs.SkillId == 101439 or eventArgs.SkillId == 100736 then -- 玩家放出对勾点猎锚第一段 读取玩家猎矛勾选的对象 self._playerFocusAnchor = FuncSet.GetNpcNoteInt(self._npc, self._camLockAnchorIndex) --print("[黑龙BOSS战本地模块]缓存玩家" .. tostring(self._npc) .. "勾取对象: " .. tostring(self._playerFocusAnchor)) FuncSet.RemoveNpcFocusTarget(self._npc) end elseif eventType == EScriptEvent.NpcExitSkill and eventArgs.LauncherId == self._npc then if eventArgs.SkillId == 100242 or eventArgs.SkillId == 101440 or eventArgs.SkillId == 100737 then if self._playerInBossLockTrigger then --自动锁定boss --print("[黑龙BOSS战本地模块]触发玩家自动锁定boss") FuncSet.SetNpcNoteInt(self._npc, 30011, self._boss) --设置目标 FuncSet.SetNpcNoteInt(self._npc, 2409, 3) --模拟手动点击 elseif self._playerFocusAnchor ~= nil and self._playerLandTower ~= nil then --锁定下一座塔 self:FocusNextTower() end end end end ---猎矛的时候锁定下一座塔 function XLevelScriptHunt01:FocusNextTower() if TowerConfig[self._playerFocusAnchor].next == nil then return end local focusId = self:GetNearestTower(TowerConfig[self._playerFocusAnchor].next) if focusId ~= nil then local uuID = FuncSet.GetSceneObjectUUID(focusId) self._timer:Schedule(0.1, self, self.TempFocus, uuID) XLog.Debug("[黑龙BOSS战本地模块]玩家当前目标:" .. self._playerFocusAnchor .. " 锁定:" .. focusId) end self._playerFocusAnchor = nil end ---暂时镜头锁定到下一个塔 function XLevelScriptHunt01:TempFocus(id) FuncSet.SetNpcFocusTarget(self._npc, id) end ---计算角度最小的塔 function XLevelScriptHunt01:GetNearestTower(towerIdSet) local nearestId = 0 local nearestAngle = 360 for i, id in pairs(towerIdSet) do local position = FuncSet.GetSceneObjectPosition(id) local angle = FuncSet.GetCameraAngleFromPos(position, false) if angle < nearestAngle then nearestAngle = angle nearestId = id end end return nearestId end function XLevelScriptHunt01:FakeLevelFinish() FuncSet.ApplyMagic(self._npc, self._npc, 715678, 1) FuncSet.ApplyMagic(self._npc, self._npc, 100000, 1) FuncSet.ApplyMagic(self._npc, self._npc, 100001, 1) FuncSet.ApplyMagic(self._npc, self._npc, 100007, 1) FuncSet.ApplyMagic(self._npc, self._npc, 100016, 1) FuncSet.ApplyMagic(self._npc, self._npc, 100021, 1) FuncSet.ApplyMagic(self._npc, self._npc, 100022, 1) FuncSet.ApplyMagic(self._npc, self._npc, 100091, 1) FuncSet.ApplyMagic(self._npc, self._npc, 100093, 1) Tool.SetFightUiActive(false) self._timer:Schedule(8, true, Tool.SetFightUiActive) self._timer:Schedule(3, self, self.BlackScreen, true) self._timer:Schedule(3.5, self, self.BlackScreen, false) end function XLevelScriptHunt01:BlackScreen(enable) if enable then FuncSet.ApplyMagic(self._npc, self._npc, 5000003, 1) else FuncSet.ApplyMagic(self._npc, self._npc, 5000006, 1) end end return XLevelScriptHunt01