CheatModel = CheatModel or BaseClass(BaseVo) CheatModel.UPDATE_CHEAT_INPUT_VIEW = "UPDATE_CHEAT_INPUT_VIEW" --更新秘籍界面数据 CheatModel.SEND_CHEAT_TO_SERVER = "SEND_CHEAT_TO_SERVER" --发送秘籍到服务端 CheatModel.CHEAT_PRINT_DEBUG_INFO = "CHEAT_PRINT_DEBUG_INFO" --打印调试信息 CheatModel.OPEN_CHEAT_SHOW_VIEW = "OPEN_CHEAT_SHOW_VIEW" --打开版号隐藏的界面 CheatModel.OPEN_CAMERA_EDIt_VIEW = "OPEN_CAMERA_EDIt_VIEW" --打开摄像机参数编辑界面 CheatModel.OPEN_UI_CAMERA_EDIT_VIEW = "OPEN_UI_CAMERA_EDIT_VIEW" --打开模型摄像机参数编辑界面 CheatModel.OPEN_BLOOM_EDIt_VIEW = "OPEN_BLOOM_EDIt_VIEW" --打开泛光参数编辑界面 CheatModel.OPEN_CLIENT_PROPERTY_VIEW = "OPEN_CLIENT_PROPERTY_VIEW" --打开属性预览界面 CheatModel.OPEN_CLIENT_ACCELERATION_VIEW = "OPEN_CLIENT_ACCELERATION_VIEW" CheatModel.Quick_Run_Code = "CheatModel.Quick_Run_Code"--快速执行Lua代码 CheatModel.CLICK_BTN_OK = "CheatModel.CLICK_BTN_OK" --点击确认秘籍 CheatModel.OPEN_FXAA_TEST_VIEW = "CheatModel.OPEN_FXAA_TEST_VIEW" -- 打开FXAA调试界面 CheatModel.OPEN_FREE_CAMERA_VIEW = "CheatModel.OPEN_FREE_CAMERA_VIEW" -- 打开发行全自由摄像机界面 CheatModel.OPEN_GREEN_SCREEN_CLICK_VIEW = "CheatModel.OPEN_GREEN_SCREEN_CLICK_VIEW" -- 打开发行绿屏切换界面 CheatModel.OPEN_SELECTROLEVIEW_SHOW_CLICK_VIEW = "CheatModel.OPEN_SELECTROLEVIEW_SHOW_CLICK_VIEW" -- 打开发行切换显示选角界面 function CheatModel:__init() CheatModel.Instance = self self.cheats_data = nil self.show_green_screen = false self.func_list = { ["@test"] = CheatModel.HandleTest, ["@perform"] = CheatModel.HandlePerform, ["@hideui"] = CheatModel.HandleHideUI, } self.module_check = "perform_" self.module_data = {} local func = function( module, data ) self.module_data[module] = data end GlobalEventSystem:Bind( EventName.SENT_MODULE_DEBUG_DATA,func) end function CheatModel:getInstance() if CheatModel.Instance == nil then CheatModel.New(); end return CheatModel.Instance end --保存服务端下发的秘籍 function CheatModel:SetCheatsData(data) self.cheats_data = data self:Fire(CheatModel.UPDATE_CHEAT_INPUT_VIEW) end function CheatModel:CheckCommand(command) -- if ClientConfig.is_out_server then -- return true -- end if not command then return true end if string.len(command) < 2 then return true end local command_mode = string.find(command, "@") if command_mode ~= 1 then return true end local handle_func = self.func_list[command] if handle_func then handle_func(self, command) return false end if string.find(command,self.module_check) then self:ModuleCheck(command) return false end if string.find(command, "@deviceid") then if SystemInfo then local temp_model = SystemInfo.deviceModel or "0" local temp_name = SystemInfo.deviceName or "1" local temp_uid = SystemInfo.deviceUniqueIdentifier or "2" local temp_gid = SystemInfo.graphicsDeviceID or "3" local temp_gvid = SystemInfo.graphicsDeviceVendorID or "4" local str = "temp_model = " .. temp_model .. " temp_name = " .. temp_name .. " temp_uid = " .. temp_uid .. " temp_gid = " .. temp_gid .. " temp_gvid = " .. temp_gvid Message.show("deviceid = " .. str) end return false end if string.find(command,"@RunCode:") then --执行Lua代码的后门 self:QuickRunCode(command) return false end if string.find(command, "@LuaProfilerStart") then Message.show("LuaProfilerStart") LuaProfiler.start() return false end if string.find(command, "@LuaProfilerStop") then LuaProfiler.stop() local str = LuaProfiler._CUSTOM_REPORTS GameError.Instance:SendErrorMsg(str) Message.show("LuaProfilerStop") return false end if string.find(command, "@OpenCheatState") then GlobalOpenCheatState = true return false end if string.find(command, "@baseres") then self:LoadBaseSceneRes() return false end return true end function CheatModel.HandleTest() GlobalEventSystem:Fire(EventName.OPEN_CHEAT_INPUT_VIEW) --秘籍 end function CheatModel.HandlePerform() GlobalEventSystem:Fire(EventName.OPEN_LUA_STATE_VIEW) --lua状态 end function CheatModel.HandleHideUI() local hide_list = {"Top","Activity","UI","Main","NameBoard","Dynamic_NameBoard"} --隐藏界面 local obj_trans = GameObject.Find("root").transform:Find("Canvas").transform for index,layer in pairs(hide_list) do obj_trans:Find(layer).gameObject:SetActive(false) end end function CheatModel:QuickRunCode( str ) if not str then print("CheatModel:QuickRunCode传值为空") return end CheatModel:getInstance():Fire(CheatModel.Quick_Run_Code,str) end function CheatModel:ModuleCheck(command) local temp = Split(command,"_") if #temp == 2 then GlobalEventSystem:Fire(EventName.CHECK_MODULE_DEBUG_DATA) local module_name = temp[2] if temp[2] ~= "" then local sent = function() local sent_data = "" for cur_module,data in pairs(self.module_data) do if module_name == "all" then sent_data = sent_data .. cur_module .. "\n" .. TableToStr(data) .. "\n" elseif cur_module == module_name then sent_data = sent_data .. cur_module .. "\n" .. TableToStr(data) break end end self.module_data = {} if Application.platform ~= RuntimePlatform.Android and Application.platform ~= RuntimePlatform.IPhonePlayer then Debugger.LogWarning("模块调试信息:" .. "\n" .. sent_data) else GameError.Instance:SendErrorMsg(sent_data,true) end end setTimeout(sent,2) end elseif #temp == 3 then local module_name = temp[2] local func_name = temp[3] if module_name ~= "" and func_name ~= "" then GlobalEventSystem:Fire(EventName.DO_MODULE_DEBUG_FUNC,module_name,func_name) end end end function CheatModel:AutoUpgradeFight() local wear_equip_list = GoodsModel:getInstance().wear_equip_list local equip = {} for _, v in pairs(wear_equip_list) do equip[v.equip_type] = v end local add_list = {} local best_equip = {} local career, level, turn = RoleManager.Instance.mainRoleInfo.career, RoleManager.Instance.mainRoleInfo.level, RoleManager.Instance.mainRoleInfo.turn StartCoroutine(function() local fun,tbl local fight1, fight2 for k, v in pairs(Config.Goods) do fun = loadstring(v) tbl = fun() if tbl.type == GoodsModel.TYPE.EQUIP then if (tbl.career_id == 0 or tbl.career_id == career) and tbl.level <= level and (tbl.turn == 0 or tbl.turn == turn) then if best_equip[tbl.equip_type] then fight1 = GetFighting(ErlangParser:GetInstance():Parse(tbl.base_attrlist)) fight2 = GetFighting(ErlangParser:GetInstance():Parse(best_equip[tbl.equip_type].base_attrlist)) best_equip[tbl.equip_type] = (best_equip[tbl.equip_type].level < tbl.level or fight2 < fight1) and tbl or best_equip[tbl.equip_type] else best_equip[tbl.equip_type] = tbl end end end --WaitForSeconds(0.25) end for k, v in pairs(best_equip) do if not equip[k] or equip[k].type_id ~= v.type_id then add_list[#add_list + 1] = v.type_id end end local cheats for k, v in pairs(add_list) do cheats = "goods_"..v.."_1" CheatModel:getInstance():Fire(CheatModel.SEND_CHEAT_TO_SERVER, cheats) WaitForSeconds(0.5) end end) end function CheatModel:OnCreateMonList( ) local mon_list = { 13010001, 13010002, 13010003, 13020001, 13020002, 13020003, 13030001, 13030002, 13030003, 10040001, 10040002, } local index = 1 local function on_step( ) local mon_id = mon_list[index] if mon_id then local cmd = string.format("mon_%d_1", mon_id) self:Fire(CheatModel.SEND_CHEAT_TO_SERVER, cmd) else if self.create_mon_timer then GlobalTimerQuest:CancelQuest(self.create_mon_timer) self.create_mon_timer = nil end end index = index + 1 end if self.create_mon_timer then GlobalTimerQuest:CancelQuest(self.create_mon_timer) self.create_mon_timer = nil end self.create_mon_timer = GlobalTimerQuest:AddPeriodQuest(on_step, 1, -1) end -- 发行绿屏统一接口 model_con:挂载模型后的UIModelCommon类 camera_type:1 主摄像机 2 UI摄像机 3 UIModel摄像机 -- mul_model_con : 发送的model_con是否是多个model_con组成的列表 -- green_click_size : 绿幕切换热区大小 function CheatModel:SetupGreenScreenEffect(show, model_con, camera_type, mul_model_con, green_click_size) -- if show and not model_con then return end if not LoginModel.ENABLE_GREEN_SCREEN then return end -- 不需要绿屏的话直接return self.temp_model_con = model_con or self.temp_model_con self.temp_camera_type = camera_type or self.temp_camera_type self.temp_mul_model_con = mul_model_con or self.temp_mul_model_con if not self.temp_model_con or not self.temp_camera_type then return end self.show_green_screen = show if not self.mc_camera then -- 获取主摄像机 self.mc_camera = MainCamera.Instance.camera if camera_type == 1 then self.target_postEffect = MainCamera.Instance.camera_gameObject:GetComponent(typeof(PostEffect)) self.default_cullingMask = self.mc_camera.cullingMask self.default_clearFlag = self.mc_camera.clearFlags self.default_color = self.mc_camera.backgroundColor end end if not self.ui_camera then -- 获取UI摄像机 self.ui_camera = MainCamera.Instance.uiCamera if camera_type == 2 then self.target_postEffect = MainCamera.Instance.uiCamera_gameObject:GetComponent(typeof(PostEffect)) self.default_cullingMask = self.ui_camera.cullingMask self.default_clearFlag = self.ui_camera.clearFlags self.default_color = self.ui_camera.backgroundColor end end if not self.ui_back_camera then -- 获取UIBack摄像机 self.ui_back_camera = GameObject.Find("root").transform:Find("UIBackRoleCamera"):GetComponent("Camera") if camera_type == 3 then self.target_postEffect = self.ui_back_camera.gameObject:GetComponent(typeof(PostEffect)) self.default_cullingMask = self.ui_back_camera.cullingMask self.default_clearFlag = self.ui_back_camera.clearFlags self.default_color = self.ui_back_camera.backgroundColor end end self.target_postEffect_enabled = self.target_postEffect and self.target_postEffect.enabled or false -- 设置需要被隐藏的摄像机 if camera_type == 1 then self.target_camera = self.mc_camera self.target_hide_camera1 = self.ui_camera self.target_hide_camera2 = self.ui_back_camera elseif camera_type == 2 then self.target_camera = self.ui_camera self.target_hide_camera1 = self.mc_camera self.target_hide_camera2 = self.ui_back_camera elseif camera_type == 3 then self.target_camera = self.ui_back_camera self.target_hide_camera1 = self.mc_camera self.target_hide_camera2 = self.ui_camera end -- 修改目标摄像机的渲染层级,修改清除模式,并控制UI摄像机的渲染 if self.target_camera then if self.show_green_screen then self.target_camera.cullingMask = bit.bor(0, bit.lshift(1, UIPartical.RenderingOther_List.Role)) self.target_camera.clearFlags = UnityEngine.CameraClearFlags.SolidColor self.target_camera.backgroundColor = Color(0, 1, 0, 1) if self.target_postEffect then self.target_postEffect.enabled = false end self.target_hide_camera1.enabled = false self.target_hide_camera2.enabled = false else self.target_camera.cullingMask = self.default_cullingMask self.target_camera.clearFlags = self.default_clearFlag self.target_camera.backgroundColor = self.default_color if self.target_postEffect then self.target_postEffect.enabled = self.target_postEffect_enabled end self.target_hide_camera1.enabled = true self.target_hide_camera2.enabled = true end end -- 根据是否绿幕修改主角模型的渲染层级 if self.temp_model_con then if not self.default_layer then -- 在修改前,按照InstanceID存储节点的layer层级 self.default_layer = {} end local layer = self.show_green_screen and UIPartical.RenderingOther_List.Role or nil local function set_role_layer(obj) if IsNull(obj) then return end for i = 0, obj.childCount - 1 do local instanceID = obj:GetChild(i):GetInstanceID() self.default_layer[instanceID] = self.default_layer[instanceID] or obj:GetChild(i).gameObject.layer obj:GetChild(i).gameObject.layer = layer or self.default_layer[instanceID] set_role_layer(obj:GetChild(i), layer) end end local function set_layer_callback(target_model_con) if target_model_con.type == SceneBaseType.FWeapon then -- 武器要特殊处理 target_model_con.weapon_hand_list = target_model_con.weapon_hand_list or {} for k, v in pairs(target_model_con.weapon_hand_list) do set_role_layer(v.transform) end else if target_model_con.role then set_role_layer(target_model_con.role.transform) end end end if mul_model_con then -- 如果temp_model_con发的是多个模型列表 for k, v in pairs(self.temp_model_con) do set_layer_callback(v) end else set_layer_callback(self.temp_model_con) end -- if self.temp_model_con.type == SceneBaseType.FWeapon then -- 武器要特殊处理 -- self.temp_model_con.weapon_hand_list = self.temp_model_con.weapon_hand_list or {} -- for k, v in pairs(self.temp_model_con.weapon_hand_list) do -- set_role_layer(v.transform) -- end -- else -- if self.temp_model_con.role then -- set_role_layer(self.temp_model_con.role.transform) -- end -- end end -- 打开切换绿屏的窗口 self:Fire(CheatModel.OPEN_GREEN_SCREEN_CLICK_VIEW, true, green_click_size) end -- 秘籍弹出的窗口调用,用来直接开关已有的绿屏 function CheatModel:EnabledGreenScreenEffect(show) if self.temp_model_con and self.temp_camera_type then self:SetupGreenScreenEffect(show, self.temp_model_con, self.temp_camera_type, self.temp_mul_model_con) end end -- 退出界面时使用,关闭绿屏,清除缓存的摄像机 function CheatModel:DisabledGreenScreenEffect(hide_tips) if self.show_green_screen then self:SetupGreenScreenEffect(false) end self.show_green_screen = false local show_str = self.temp_model_con and true or false self.temp_model_con = nil self.temp_camera_type = nil self.temp_mul_model_con = nil self.mc_camera = nil self.ui_camera = nil self.ui_back_camera = nil self.target_camera = nil self.target_hide_camera1 = nil self.target_hide_camera2 = nil self.default_layer = nil self:Fire(CheatModel.OPEN_GREEN_SCREEN_CLICK_VIEW, false) LoginModel.ENABLE_GREEN_SCREEN = false if show_str and not hide_tips then Message.show("退出绿屏模式,需要时请重新启用") end end function CheatModel:LoadBaseSceneRes( ) self.scene_index = self.scene_index or 1 self.scene_list = { --大世界 "1001", "1002", "1003", "1004", "1005", "1006", "1007", "1008", --副本玩法 "2051", "2001", "2071", "7001", "4064", "4063", } self.scene_id = self.scene_list[self.scene_index] local function on_load_scene( ) local function load_scene_call_back( objs ) if objs then self.async_load_map_obj = UnitySceneManager.LoadSceneAsync(self.scene_id) end end lua_resM:loadPrefabs(self, "terrain_scene_" .. self.scene_id, {}, load_scene_call_back) print("tanar: [CheatModel 444]=> self.scene_id: ",self.scene_id) end local function on_load_finish( ) if self.check_load_event then GlobalTimerQuest:CancelQuest(self.check_load_event) self.check_load_event = nil end self.scene_id = tostring(SceneManager:getInstance():GetSceneId()) on_load_scene() Message.show("加载完成") GlobalEventSystem:Fire(EventName.HIDE_LOADING_VIEW) end local check_load = function() if self.async_load_map_obj then local progress = self.async_load_map_obj.progress local max_progress = 1 if progress >= max_progress then self.async_load_map_obj = nil self.scene_index = self.scene_index + 1 self.scene_id = self.scene_list[self.scene_index] if tonumber(self.scene_id) == SceneManager:getInstance():GetSceneId() then self.scene_index = self.scene_index + 1 self.scene_id = self.scene_list[self.scene_index] end if not self.scene_id then on_load_finish() return end on_load_scene() end end end on_load_scene() GlobalEventSystem:Fire(EventName.SHOW_LOADING_VIEW) if self.check_load_event then GlobalTimerQuest:CancelQuest(self.check_load_event) end self.check_load_event = GlobalTimerQuest:AddPeriodQuest(check_load, 0.5, -1) end