require("game.scene.MainCamera")
|
|
require("game.scene.Scene")
|
|
require("game.scene.SceneConfig")
|
|
require("operation.OperateManager")
|
|
require("game.mainUI.PreChangeSceneView")
|
|
|
|
SceneManager = SceneManager or BaseClass(BaseModel)
|
|
local SceneManager = SceneManager
|
|
local GlobalEventSystem = GlobalEventSystem
|
|
local SceneEventType = SceneEventType
|
|
local table_remove = table.remove
|
|
local table_insert = table.insert
|
|
local math_sqrt = math.sqrt
|
|
local math_pow = math.pow
|
|
local math_acos = math.acos
|
|
local math_floor = math.floor
|
|
local math_pi = math.pi
|
|
|
|
SceneManager.START = "SceneManager_event_start"
|
|
SceneManager.DISPOSE ="SceneManager_event_dispose"
|
|
|
|
function SceneManager:__init()
|
|
if SceneManager.Instance ~= nil then
|
|
LogError("SceneManager is a singleton class")
|
|
end
|
|
|
|
SceneManager.Instance = self
|
|
|
|
self.client_role_num = 0 -- 当前客户端显示的角色数量
|
|
self.server_role_num = 0 -- 当前服务器显示的角色数量
|
|
self.role_limit_num = Config.otherFightInfo.scene_max_role_count -- 最大显示人数
|
|
|
|
self.scene_Info = nil --当前场景数据
|
|
self.last_scene_id = 0 --上一个场景ID
|
|
self.curr_scene_id = 0 --当前场景ID
|
|
self.next_scene_id = 0 --下一个场景ID
|
|
self.last_dun_id = 0 --上一个副本id
|
|
self.curr_dun_id = 0 --副本,0代表不是副本场景
|
|
|
|
self.npc_doors_loaded = false
|
|
self.jumppoint_loaded = false
|
|
|
|
self.isStart = false --场景是否加载完成
|
|
self.role_vo_list = {} --其他玩家 Vo列表
|
|
self.partner_vo_list = {} --伙伴Vo列表
|
|
self.monster_vo_list = {} --怪物 Vo列表(怪物的instance_id作为key)
|
|
self.npc_vo_list = {} --Npc Vo列表(Npc的instance_id作为key)
|
|
self.sceneNpcList = {} --当前场景的NPC,12100协议列表数据
|
|
self.door_vo_list = {} --门点 Vo列表(enter_scene_id作为key)
|
|
self.monster_type_list = {} --怪物类型列表
|
|
self.monster_type_in_scenes = {} -- 每个场景里的所有怪物类型
|
|
self.jump_vo_list = {} --跳点对象列表
|
|
self.other_vo_list = {} --除了以上以外的一般场景对象
|
|
self.grave_vo_list = {} --怪物死亡墓碑vo列表
|
|
|
|
self.monster_vo_pool = Array.New()
|
|
self.role_vo_pool = Array.New()
|
|
|
|
self.delay_role_vo_list = {} -- 延迟创建角色
|
|
self.delay_monster_list = Array.New() --延迟加载的怪物列表
|
|
|
|
--主角中的嘲讽buff的发起者
|
|
self.chaofeng_attacker_compress_id = nil
|
|
|
|
--被主角攻击过的玩家id
|
|
self.mainRole_attacker_list = {}
|
|
self.mainRole_attacker_count = 0
|
|
|
|
--攻击过主角的玩家id
|
|
self.mainRole_defender_list = {}
|
|
self.mainRole_defender_count = 0
|
|
|
|
--被主角杀死的怪物数量,当前只用于经验副本
|
|
self.mainRole_kill_monster_count = 0
|
|
|
|
--记录最近一次和其他玩家战斗的时间
|
|
self.last_role_attact_time = 0
|
|
|
|
--主角释放技能成功 服务端返回后的技能列表 记录每个主角技能等服务端返回后的时间
|
|
self.main_role_server_back_skill_list = {}
|
|
|
|
self.clone_role_id_count = 0
|
|
self.clone_role_start_id = 274877906944 -- 2的38次方
|
|
|
|
self.killerName = "" --凶手名字
|
|
self.killerGuildName = "" --凶手社团名字
|
|
self.killerType = 0 --凶手的类型 1怪 2人
|
|
self.killerRoleId = 0
|
|
self.killerVo = nil --杀手信息
|
|
|
|
self.can_relive = 1 --是否能复活
|
|
self.next_relive_time = 0 --下次能复活的时间戳
|
|
|
|
self.last_fight_msg = {} --上一次给服务端发送的20001对象,副技能用
|
|
self.is_collect = false --是否在采集
|
|
|
|
self.is_no_loading_scene = false
|
|
self.temp_check_list = {} --缓存的当前场景的判断列表
|
|
|
|
self.mat_prop_blocks = {}
|
|
self.curr_frame_rate = FINAL_FRAMERATE --当前计算的平均帧频
|
|
self:InitPropBlocks()
|
|
|
|
self.temp_monster_bounds_size = {} --缓存当前场景怪物模型的包围盒高度
|
|
self.set_model_limit_flag = true --部分多人玩法要开启外观限制
|
|
self.is_first_enter_tower_dun = false--爬塔副本第一次进入不需要无缝切换
|
|
|
|
self.curr_req_scene_id = false --当前正在请求切换场景的id
|
|
self.record_pre_monster_data={}
|
|
|
|
self.drop_pos_unit = 80--掉落位置单位数
|
|
|
|
self.mirror_scene_id = SceneActivityMirrorSceneId.None
|
|
self.last_mirror_scene_id = SceneActivityMirrorSceneId.None
|
|
|
|
self:InitDropPosCfg()--初始化掉落随机位置列表
|
|
|
|
self.camera_rotate_cfg = {} --场景摄像机旋转参数
|
|
end
|
|
|
|
function SceneManager:getInstance()
|
|
if SceneManager.Instance == nil then
|
|
SceneManager.New()
|
|
end
|
|
return SceneManager.Instance
|
|
end
|
|
|
|
function SceneManager:InitPropBlocks( )
|
|
local blocks = Optimizer.CreateMatPropertyBlocks(20)
|
|
for i=0, blocks.Length-1 do
|
|
table.insert(self.mat_prop_blocks, blocks[i])
|
|
end
|
|
end
|
|
|
|
function SceneManager:PushPorpBlock( prop_block )
|
|
if self.mat_prop_blocks and prop_block then
|
|
table.insert(self.mat_prop_blocks, prop_block)
|
|
end
|
|
end
|
|
|
|
function SceneManager:PopPorpBlock()
|
|
local prop_block = false
|
|
if self.mat_prop_blocks then
|
|
prop_block = table.remove(self.mat_prop_blocks)
|
|
end
|
|
if not prop_block then
|
|
prop_block = Optimizer.CreateMatPropertyBlock()
|
|
end
|
|
return prop_block
|
|
end
|
|
|
|
function SceneManager:GetMonsterBoundsSize( type_id )
|
|
return self.temp_monster_bounds_size[type_id]
|
|
end
|
|
|
|
function SceneManager:SetMonsterBoundsSize( type_id, size_y )
|
|
self.temp_monster_bounds_size[type_id] = size_y
|
|
end
|
|
|
|
function SceneManager:SetLastPkTime( )
|
|
self.last_role_attact_time = TimeUtil:getServerTime()
|
|
end
|
|
|
|
function SceneManager:SetLastFightMsg(type,msg,att_object_id)
|
|
self.last_fight_msg[type] = self.last_fight_msg[type] or {}
|
|
if type == SceneBaseType.MainRole then
|
|
self.last_fight_msg[type] = msg
|
|
elseif type == SceneBaseType.Pokemon then
|
|
self.last_fight_msg[type][att_object_id] = msg
|
|
end
|
|
end
|
|
|
|
function SceneManager:GetLastFightMsg(type,att_object_id)
|
|
if type == SceneBaseType.MainRole then
|
|
return self.last_fight_msg[type]
|
|
elseif type == SceneBaseType.Pokemon then
|
|
if self.last_fight_msg[type] and self.last_fight_msg[type][att_object_id] then
|
|
return self.last_fight_msg[type][att_object_id]
|
|
end
|
|
end
|
|
end
|
|
|
|
function SceneManager:SetKillerInfo(type, killerId)
|
|
end
|
|
|
|
function SceneManager:AddMainRoleBackSkill(skill_id)
|
|
self.main_role_server_back_skill_list[skill_id] = Status.NowTime
|
|
end
|
|
|
|
function SceneManager:GetMainRoleBackSkillTime(skill_id)
|
|
return self.main_role_server_back_skill_list[skill_id]
|
|
end
|
|
|
|
function SceneManager:RemoveMainRoleBackSkill(skill_id)
|
|
self.main_role_server_back_skill_list[skill_id] = nil
|
|
end
|
|
|
|
function SceneManager:ClearMainRoleBackSkill()
|
|
self.main_role_server_back_skill_list = {}
|
|
end
|
|
|
|
function SceneManager:AddMainRoleAttacker(role_id, skill_id)
|
|
-- local attacker_info = self.mainRole_attacker_list[role_id]
|
|
-- if attacker_info == nil then
|
|
-- attacker_info = {start_time = Status.NowTime, skill_id = skill_id, attack_count = 1}
|
|
-- self.mainRole_attacker_list[role_id] = attacker_info
|
|
-- self.mainRole_attacker_count = self.mainRole_attacker_count + 1
|
|
-- local max_count = Config.otherFightInfo.mainRole_attacker_max_count
|
|
-- if self.mainRole_attacker_count > max_count then
|
|
-- local min_start_time = 99999
|
|
-- local min_role_id = nil
|
|
-- for id, vo in pairs(self.mainRole_attacker_list) do
|
|
-- if min_start_time > vo.start_time then
|
|
-- min_start_time = vo.start_time
|
|
-- min_role_id = id
|
|
-- end
|
|
-- end
|
|
-- if min_role_id then
|
|
-- self.mainRole_attacker_list[min_role_id] = nil
|
|
-- end
|
|
-- end
|
|
-- else
|
|
-- attacker_info.start_time = Status.NowTime
|
|
-- if attacker_info.skill_id == skill_id then
|
|
-- attacker_info.attack_count = attacker_info.attack_count + 1
|
|
-- else
|
|
-- attacker_info.skill_id = skill_id
|
|
-- attacker_info.attack_count = 1
|
|
-- end
|
|
-- end
|
|
end
|
|
|
|
function SceneManager:AddMainRoleDefender(role_id)
|
|
local defender_info = self.mainRole_defender_list[role_id]
|
|
if defender_info == nil then
|
|
defender_info = {start_time = Status.NowTime}
|
|
self.mainRole_defender_list[role_id] = defender_info
|
|
self.mainRole_defender_count = self.mainRole_defender_count + 1
|
|
local max_count = Config.otherFightInfo.mainRole_defender_max_count
|
|
if self.mainRole_defender_count > max_count then
|
|
local min_start_time = 99999
|
|
local min_role_id = nil
|
|
for id, vo in pairs(self.mainRole_defender_list) do
|
|
if min_start_time > vo.start_time then
|
|
min_start_time = vo.start_time
|
|
min_role_id = id
|
|
end
|
|
end
|
|
if min_role_id then
|
|
self.mainRole_defender_list[min_role_id] = nil
|
|
end
|
|
end
|
|
|
|
-- if RoleManager.Instance.mainRoleInfo.pk_status == RoleVo.PK_STATUS.Peace then
|
|
-- local role_vo = self:GetRoleVo(role_id)
|
|
-- if role_vo then
|
|
-- role_vo:ChangeVar("pk_status", role_vo.pk_status, nil, true)
|
|
-- end
|
|
-- end
|
|
else
|
|
defender_info.start_time = Status.NowTime
|
|
end
|
|
end
|
|
|
|
function SceneManager:ClearMainRoleAttacker()
|
|
self.mainRole_attacker_list = {}
|
|
self.mainRole_attacker_count = 0
|
|
end
|
|
|
|
function SceneManager:ResetMainRoleAttackerAttackCount()
|
|
for id, info in pairs(self.mainRole_attacker_list) do
|
|
info.attack_count = 0
|
|
end
|
|
end
|
|
|
|
function SceneManager:ClearMainRoleDefender()
|
|
self.mainRole_defender_list = {}
|
|
self.mainRole_defender_count = 0
|
|
end
|
|
|
|
--被主角击杀的obj数量,用于经验副本和虚空秘境
|
|
function SceneManager:AddMainRoleKillCount(obj_type)
|
|
if (SceneManager.Instance:IsAwakeScene() or SceneManager.Instance:IsExpScene()) and obj_type == SceneBaseType.Monster then
|
|
self.mainRole_kill_monster_count = self.mainRole_kill_monster_count + 1
|
|
end
|
|
end
|
|
|
|
function SceneManager:ResetMainRoleKillMonsterCount()
|
|
self.mainRole_kill_monster_count = 0
|
|
end
|
|
|
|
--返回登录,清空一下数据
|
|
function SceneManager:GameStartClearCache()
|
|
self.last_scene_id = 0
|
|
self.curr_scene_id = 0
|
|
self:SetCurrentReqChangeSceneId(false)
|
|
self.curr_dun_id = 0
|
|
self:SetLastDunId( 0 )
|
|
end
|
|
|
|
function SceneManager:SetCurrDunId(dun_id)
|
|
self:SetLastDunId( self.curr_dun_id )
|
|
self.curr_dun_id = dun_id
|
|
-- BaseDungeonModel:getInstance():InitDungeonInfo(self.curr_dun_id)
|
|
|
|
-- if not (self.last_dun_id == self.curr_dun_id and self.last_dun_id > 0) then --不是同一个副本的切场景情况就要重置怒气
|
|
-- RoleManager.Instance.mainRoleInfo:ChangeVar("anger", 0, nil, true)
|
|
-- end
|
|
end
|
|
|
|
function SceneManager:GetCurrDunId()
|
|
return self.curr_dun_id or 0
|
|
end
|
|
|
|
function SceneManager:SetCurrentSceneId(sceneId)
|
|
self.last_scene_id = self.curr_scene_id
|
|
self.curr_scene_id = sceneId
|
|
self.scene_Info = self:GetSceneInfo(sceneId)
|
|
self:SetCurrentReqChangeSceneId(false)
|
|
self.temp_check_list = {}
|
|
|
|
self.role_limit_num = 40 -- 最大显示人数
|
|
if self:IsMainCityAndFieldScene() then
|
|
self.role_limit_num = 30
|
|
elseif self:IsGuildScene() then
|
|
self.role_limit_num = 45
|
|
end
|
|
end
|
|
|
|
function SceneManager:SetCurrentReqChangeSceneId(sceneId)
|
|
self.curr_req_scene_id = sceneId
|
|
end
|
|
|
|
function SceneManager:IsReqChangeScene()
|
|
return self.curr_req_scene_id ~= false
|
|
end
|
|
|
|
function SceneManager:GetLastSceneId()
|
|
return self.last_scene_id
|
|
end
|
|
|
|
function SceneManager:SetLastDunId( dun_id )
|
|
self.last_dun_id = dun_id or 0
|
|
--2020.4.27新增一个针对副本类任务的补充处理
|
|
--[[
|
|
因 副本失败之后 需要 上次副本标记 来修复处理自动任务的重复进副本
|
|
引起 连续进同一个副本的任务且中间过程没有切地图的时候 第二次会中断任务
|
|
解决方式:61003返回副本成功之后重置 上次副本标记
|
|
--]]
|
|
end
|
|
|
|
function SceneManager:GetLastDunId()
|
|
return self.last_dun_id
|
|
end
|
|
|
|
function SceneManager:GetSceneId()
|
|
return self.curr_scene_id
|
|
end
|
|
|
|
function SceneManager:GetSceneName(sceneId)
|
|
if sceneId then
|
|
local data = self:GetSceneInfo(sceneId)
|
|
if data then
|
|
return data.name
|
|
end
|
|
else
|
|
if self.scene_Info then
|
|
return self.scene_Info.name
|
|
end
|
|
end
|
|
return ""
|
|
end
|
|
|
|
function SceneManager:GetSceneType(sceneId)
|
|
local scene_Info = self:GetSceneInfo(sceneId)
|
|
return scene_Info and scene_Info.type or 0
|
|
end
|
|
|
|
function SceneManager:GetSceneBirthPos(sceneId)
|
|
local scene_Info = self:GetSceneInfo(sceneId)
|
|
if scene_Info then
|
|
return scene_Info.x, scene_Info.y
|
|
end
|
|
end
|
|
|
|
function SceneManager:GetSceneInfo(sceneId)
|
|
|
|
sceneId = sceneId or self:GetSceneId()
|
|
if self.scene_Info and self.scene_Info.id == sceneId then
|
|
return self.scene_Info
|
|
end
|
|
local data = ConfigItemMgr.Instance:GetSceneItem(sceneId)
|
|
if not data and sceneId > 0 then
|
|
Message.show("场景DB文件缺失数据,ID:" .. sceneId)
|
|
end
|
|
return data
|
|
end
|
|
|
|
function SceneManager:GetSceneNpcInfo(npcId, sceneId)
|
|
local sceneId = sceneId or self:GetSceneId()
|
|
local sceneInfo = self:GetSceneInfo(sceneId)
|
|
if sceneInfo and type(sceneInfo.Npcs) == "table" then
|
|
for npc_id, npc_info in pairs(sceneInfo.Npcs) do
|
|
if tonumber(npc_id) == tonumber(npcId) then
|
|
return npc_info
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--获取场景内的跳点配置
|
|
function SceneManager:GetSceneJumpPoints()
|
|
if self.scene_Info == nil then
|
|
return {}
|
|
end
|
|
|
|
local scene_id = self:GetSceneId()
|
|
local jump_info = Config.JumpSceneInfo[scene_id]
|
|
if jump_info == nil then
|
|
return {}
|
|
end
|
|
|
|
return jump_info
|
|
end
|
|
|
|
function SceneManager:GetSceneDoors()
|
|
if self.scene_Info == nil or self.scene_Info.Doors == nil then
|
|
return {}
|
|
end
|
|
return self.scene_Info.Doors
|
|
end
|
|
|
|
function SceneManager:GetSceneDoorInfo(id, sceneId)
|
|
sceneId = sceneId or self:GetSceneId()
|
|
local sceneInfo = self:GetSceneInfo(sceneId)
|
|
if sceneInfo == nil or sceneInfo.Doors == nil then
|
|
return nil
|
|
end
|
|
return sceneInfo.Doors[id]
|
|
end
|
|
|
|
function SceneManager:ClearAllVo()
|
|
self.isStart = false
|
|
self:ClearMainRoleDefender()
|
|
self:ClearMainRoleAttacker()
|
|
self:ClearMainRoleBackSkill()
|
|
self:ClearAllRoleVo()
|
|
self:ClearAllMonsterVo()
|
|
self:ClearAllPartnerVo()
|
|
self:ClearAllOtherVo()
|
|
self:ClearAllGraveVo()
|
|
|
|
--场景有变化时才清空传送门和NPC
|
|
if self:GetSceneId() ~= self.last_scene_id then
|
|
self:ClearAllNpcVo()
|
|
self:ClearAllDoorVo()
|
|
self:ClearAllJumpPointVo()
|
|
self.npc_doors_loaded = false
|
|
self.jumppoint_loaded = false
|
|
end
|
|
|
|
self.monster_type_list = {}
|
|
SceneManager.ResetCacheSceneType(self)
|
|
GlobalEventSystem:Fire(SceneManager.DISPOSE)
|
|
end
|
|
|
|
function SceneManager:LoadJumpPoints()
|
|
if self.jumppoint_loaded then
|
|
return
|
|
end
|
|
local jumppoints = self:GetSceneJumpPoints()
|
|
if jumppoints then
|
|
for id, info in ipairs(jumppoints) do
|
|
local jumppoint_vo = JumpPointVo.New()
|
|
jumppoint_vo:CreateJumpPointInfo(id,info)
|
|
self:AddJumpPointVo(jumppoint_vo)
|
|
end
|
|
end
|
|
|
|
self.jumppoint_loaded = true
|
|
end
|
|
|
|
function SceneManager:LoadNpcsAndDoors()
|
|
if self.npc_doors_loaded then
|
|
return
|
|
end
|
|
|
|
local doors = self:GetSceneDoors()
|
|
local doorId = 1
|
|
if doors then
|
|
if SceneManager.Instance:IsIntrusionWorldHoneScene() then
|
|
for id, info in pairs(doors) do
|
|
local door_vo = DoorVo.New()
|
|
door_vo:CreateDoorInfo(info)
|
|
door_vo.id = doorId --流水id
|
|
if IntrusionModel:getInstance().default_server_rank_list[door_vo.index] then
|
|
doorId = doorId + 1
|
|
self:AddDoorVo(door_vo)
|
|
end
|
|
end
|
|
else
|
|
for id, info in pairs(doors) do
|
|
local door_vo = DoorVo.New()
|
|
door_vo:CreateDoorInfo(info)
|
|
door_vo.id = doorId --流水id
|
|
doorId = doorId + 1
|
|
self:AddDoorVo(door_vo)
|
|
end
|
|
local info = Config.ConfigDoorInSameScene[SceneManager.Instance:GetSceneId()]
|
|
if info then
|
|
for id, info in pairs(Config.ConfigDoorInSameScene[SceneManager.Instance:GetSceneId()]) do --在同一个场景里的传送门
|
|
local door_vo = DoorVo.New()
|
|
door_vo:CreateDoorInfo(info)
|
|
door_vo.id = doorId --流水id
|
|
-- print("创建传送门 ",door_vo.id)
|
|
-- door_vo.enter_scene_id = door_vo.enter_scene_id.."-"..door_vo.index
|
|
door_vo.is_same_scene = true
|
|
door_vo.enter_scene_name = info.name
|
|
doorId = doorId + 1
|
|
self:AddDoorVo(door_vo)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local npcs = self:GetNpcList()
|
|
for id, info in pairs(npcs) do
|
|
local npc_id = info.instance_id or info.npc_id
|
|
if npc_id ~= 0 then
|
|
if info.is_show == 0 then
|
|
if self.npc_vo_list[npc_id] then
|
|
self:DeleteNpcVo(npc_id)
|
|
end
|
|
else
|
|
local npc_info = NpcVo.New()
|
|
npc_info:CreateNpcInfo(info)
|
|
self:AddNpcVo(npc_info)
|
|
end
|
|
end
|
|
end
|
|
self.npc_doors_loaded = true
|
|
end
|
|
|
|
function SceneManager:SceneStart()
|
|
self.isStart = true
|
|
self:TryFireStartEvent()
|
|
end
|
|
|
|
function SceneManager:TryFireStartEvent()
|
|
if not self.isStart or GlobalEventSystem == nil then
|
|
return
|
|
end
|
|
GlobalEventSystem:Fire(SceneManager.START)
|
|
end
|
|
|
|
function SceneManager:IsSceneStart()
|
|
return self.isStart
|
|
end
|
|
|
|
function SceneManager:AddJumpPointVo( jump_vo)
|
|
self.jump_vo_list[jump_vo.instance_id] = jump_vo
|
|
GlobalEventSystem:Fire(SceneEventType.JUMPPOINT_VO_ADD, jump_vo)
|
|
end
|
|
|
|
function SceneManager:ClearAllJumpPointVo( )
|
|
for k, _ in pairs(self.jump_vo_list) do
|
|
GlobalEventSystem:Fire(SceneEventType.JUMPPOINT_VO_REMOVE, k)
|
|
end
|
|
self.jump_vo_list = {}
|
|
end
|
|
|
|
--[[@
|
|
功能: 添加一个门点信息到VoManager
|
|
参数:
|
|
enter_scene_id 进入场景实例ID int32
|
|
door_vo 门点Vo结构体 Vo
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
]]
|
|
function SceneManager:AddDoorVo( door_vo)
|
|
local id = door_vo.enter_scene_id
|
|
if door_vo.is_same_scene then
|
|
id = door_vo.enter_scene_id.."-"..door_vo.index
|
|
end
|
|
self.door_vo_list[id] = door_vo
|
|
GlobalEventSystem:Fire(SceneEventType.DOOR_VO_ADD, id, door_vo)
|
|
end
|
|
|
|
--[[@
|
|
功能: 场景传送点
|
|
]]
|
|
function SceneManager:GetTheDoorVo( )
|
|
for k,v in pairs(self.door_vo_list) do
|
|
return v
|
|
end
|
|
end
|
|
|
|
--[[@
|
|
功能: 根据进入场景ID获取一个门点信息
|
|
参数:
|
|
enter_scene_id 进入场景实例ID int32
|
|
返回值:
|
|
对应的门点信息 Vo
|
|
其它: 无
|
|
|
|
]]
|
|
function SceneManager:GetDoorVo( enter_scene_id )
|
|
return self.door_vo_list[enter_scene_id]
|
|
end
|
|
|
|
function SceneManager:GetDoorVoList()
|
|
return self.door_vo_list
|
|
end
|
|
function SceneManager:ClearAllDoorVo( )
|
|
for k,vo in pairs(self.door_vo_list) do
|
|
-- local id = k
|
|
-- if vo.is_same_scene then
|
|
-- id = vo.enter_scene_id.."-"..vo.index
|
|
-- end
|
|
GlobalEventSystem:Fire(SceneEventType.DOOR_VO_REMOVE, k)
|
|
end
|
|
self.door_vo_list = {}
|
|
end
|
|
|
|
function SceneManager:GetNpcList()
|
|
return self.sceneNpcList
|
|
end
|
|
|
|
function SceneManager:SetNpcList(list)
|
|
self.sceneNpcList = list
|
|
|
|
end
|
|
|
|
function SceneManager:UpdateNpcListPos(npc_id, real_x, real_y)
|
|
if self.sceneNpcList[npc_id] then
|
|
self.sceneNpcList[npc_id].pos_x = real_x
|
|
self.sceneNpcList[npc_id].pos_y = real_y
|
|
end
|
|
end
|
|
|
|
function SceneManager:GetSceneNpcInfoByID( npc_id )
|
|
return self.sceneNpcList[npc_id]
|
|
end
|
|
|
|
--[[@
|
|
功能: 添加一个Npc信息到Manger
|
|
参数:
|
|
npc_ins_id Npc实例ID int32
|
|
npc_vo NpcVo信息 object
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
]]
|
|
function SceneManager:AddNpcVo(npc_vo)
|
|
self.npc_vo_list[npc_vo.instance_id] = npc_vo
|
|
self.sceneNpcList[npc_vo.instance_id] = npc_vo
|
|
GlobalEventSystem:Fire(SceneEventType.NPC_VO_ADD, npc_vo.instance_id, npc_vo)
|
|
end
|
|
|
|
function SceneManager:DynamicAddNpc(npcid,npc_x,npc_y, args)
|
|
if npcid and npc_x and npc_y then
|
|
local npc_info = NpcVo.New()
|
|
local info = {npc_id = npcid, pos_x = npc_x, pos_y = npc_y, args = args}
|
|
npc_info:CreateNpcInfo(info)
|
|
|
|
npc_info.pos_x = npc_x --X坐标(int16)
|
|
npc_info.pos_y = npc_y --Y坐标(int16)
|
|
npc_info.logic_x = npc_info.pos_x / SceneObj.LogicRealRatio.x
|
|
npc_info.logic_y = npc_info.pos_y / SceneObj.LogicRealRatio.y
|
|
print("= = =添加NPC:", npc_info.pos_x, npc_info.pos_y)
|
|
self:AddNpcVo(npc_info)
|
|
end
|
|
end
|
|
|
|
--[[@
|
|
功能: 动态删除Npc
|
|
参数:
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
作者: deadline
|
|
]]
|
|
function SceneManager:DynamicDelNpc(npcid)
|
|
if self.npc_vo_list[npcid] then
|
|
self:DeleteNpcVo(npcid)
|
|
end
|
|
end
|
|
|
|
--[[@
|
|
功能: 获取一个Npc信息
|
|
参数:
|
|
npc_ins_id Npc实例ID int32
|
|
返回值:
|
|
获取到的Npc信息
|
|
其它: 无
|
|
]]
|
|
function SceneManager:GetNpcVo( npc_ins_id )
|
|
return self.npc_vo_list[npc_ins_id]
|
|
end
|
|
|
|
--[[@
|
|
功能: 清除所有Npc Vo信息
|
|
参数:
|
|
无
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
]]
|
|
function SceneManager:ClearAllNpcVo( )
|
|
for k,_ in pairs(self.npc_vo_list) do
|
|
GlobalEventSystem:Fire(SceneEventType.NPC_VO_REMOVE, k)
|
|
end
|
|
self.npc_vo_list = {}
|
|
end
|
|
|
|
--[[
|
|
功能:清除npc
|
|
其他.
|
|
]]
|
|
function SceneManager:DeleteNpcVo(id)
|
|
if self.npc_vo_list[id] ~= nil then
|
|
GlobalEventSystem:Fire(SceneEventType.NPC_VO_REMOVE, id)
|
|
end
|
|
self.sceneNpcList[id] = nil
|
|
self.npc_vo_list[id] = nil
|
|
end
|
|
|
|
--添加怪物类型
|
|
function SceneManager:AddMonsterType(monsterTypeVo)
|
|
self.monster_type_list[monsterTypeVo.type_id] = monsterTypeVo
|
|
end
|
|
|
|
--[[
|
|
功能:获取怪物类型vo
|
|
其他.
|
|
]]
|
|
-- function SceneManager:GetMonsterType(type_id)
|
|
-- return self.monster_type_list[type_id]
|
|
-- end
|
|
|
|
-- function SceneManager:GetAllMonsterTypes()
|
|
-- return self.monster_type_list
|
|
-- end
|
|
|
|
--获取指定场景中的所有怪物类型
|
|
-- function SceneManager:GetMonsterTypeInScene(scene_id)
|
|
-- self.monster_type_in_scenes = self.monster_type_in_scenes or {}
|
|
-- local monster_types = self.monster_type_in_scenes[scene_id]
|
|
-- return monster_types
|
|
-- end
|
|
|
|
-- function SceneManager:AddMonsterTypeInScene(scene_id, types)
|
|
-- self.monster_type_in_scenes[scene_id] = types
|
|
-- end
|
|
--[[@
|
|
功能: 添加一个怪物Vo信息到Manager
|
|
参数:
|
|
ins_id 怪物实例ID int32
|
|
monster_vo 怪物Vo信息 MonsterVo
|
|
isdelay 是否是 延迟加载
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
|
|
]]
|
|
function SceneManager:AddMonsterVo( monster_vo, isdelay )
|
|
-- if self:GetMonsterType(monster_vo.type_id) == nil then
|
|
-- local monsterTypeVo = MonsterTypeVo.New()
|
|
-- monsterTypeVo.type_id = monster_vo.type_id
|
|
-- monsterTypeVo.name = monster_vo.name
|
|
-- monsterTypeVo.type = monster_vo.type
|
|
-- monsterTypeVo.pos_x = monster_vo.pos_x
|
|
-- monsterTypeVo.pos_y = monster_vo.pos_y
|
|
-- monsterTypeVo.level = monster_vo.level
|
|
-- monsterTypeVo.guaji_flag = monster_vo.guaji_flag
|
|
-- monsterTypeVo.boss_type = monster_vo.boss_type
|
|
-- monsterTypeVo.res_id = monster_vo.monster_res
|
|
-- self:AddMonsterType(monsterTypeVo)
|
|
-- end
|
|
if self:IsInRecordPreMonsterData(monster_vo.instance_id) then
|
|
if self.record_pre_monster_data[monster_vo.instance_id] and self.record_pre_monster_data[monster_vo.instance_id].name then
|
|
monster_vo.name = self.record_pre_monster_data[monster_vo.instance_id].name
|
|
end
|
|
if self.record_pre_monster_data[monster_vo.instance_id] and self.record_pre_monster_data[monster_vo.instance_id].level then
|
|
monster_vo.level = self.record_pre_monster_data[monster_vo.instance_id].level
|
|
end
|
|
if self.record_pre_monster_data[monster_vo.instance_id] and self.record_pre_monster_data[monster_vo.instance_id].hp then
|
|
monster_vo.hp = self.record_pre_monster_data[monster_vo.instance_id].hp
|
|
end
|
|
if self.record_pre_monster_data[monster_vo.instance_id] and self.record_pre_monster_data[monster_vo.instance_id].maxHp then
|
|
monster_vo.maxHp = self.record_pre_monster_data[monster_vo.instance_id].maxHp
|
|
end
|
|
end
|
|
isdelay = isdelay or false
|
|
if isdelay == true and monster_vo.load_immediately ~= 1 then --延迟加载
|
|
self.delay_monster_list:PushBack(monster_vo)
|
|
else
|
|
self.monster_vo_list[monster_vo.instance_id] = monster_vo
|
|
GlobalEventSystem:Fire(SceneEventType.MONSTER_VO_ADD, monster_vo.instance_id, monster_vo)
|
|
end
|
|
end
|
|
|
|
--12090 怪物改名,改名可能比创怪完毕更早来,没找到对象时先记录一下 ,创怪时再重新赋值
|
|
function SceneManager:RecordPreMonsterData(instance_id,data)
|
|
self.record_pre_monster_data[instance_id] = self.record_pre_monster_data[instance_id] or {}
|
|
self.record_pre_monster_data[instance_id].id = instance_id
|
|
if data.name then
|
|
self.record_pre_monster_data[instance_id].name = data.name
|
|
end
|
|
if data.level then
|
|
self.record_pre_monster_data[instance_id].level = data.level
|
|
end
|
|
if data.hp then
|
|
self.record_pre_monster_data[instance_id].hp = data.hp
|
|
end
|
|
if data.maxHp then
|
|
self.record_pre_monster_data[instance_id].maxHp = data.maxHp
|
|
end
|
|
end
|
|
|
|
function SceneManager:IsInRecordPreMonsterData(instance_id)
|
|
for k,v in pairs(self.record_pre_monster_data) do
|
|
if instance_id == v.id then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function SceneManager:ClearRecordPreMonsterData(instance_id)
|
|
if self.record_pre_monster_data and self.record_pre_monster_data[instance_id] then
|
|
self.record_pre_monster_data[instance_id] = nil
|
|
end
|
|
end
|
|
|
|
--[[@
|
|
功能: 根据怪物实例ID获取怪物Vo信息
|
|
参数:
|
|
ins_id 怪物实例ID int32
|
|
返回值:
|
|
怪物Vo信息 MonsterVo
|
|
其它: 无
|
|
|
|
]]
|
|
function SceneManager:GetMonsterVo( ins_id )
|
|
return self.monster_vo_list[ins_id]
|
|
end
|
|
|
|
--删除指定类型的怪物
|
|
function SceneManager:DeleteMonstersByType(type_id)
|
|
for i, v in pairs(self.monster_vo_list) do
|
|
if v.type_id == type_id and not v.is_client_monster then
|
|
self:DeleteMonsterVo(v.instance_id, SceneManager.DELETE_MONSTER_BY_TYPE)
|
|
end
|
|
end
|
|
end
|
|
|
|
--根据唯一id 获取客户端剧情怪物
|
|
function SceneManager:GetClientMonsterVoByInstanceId(ins_id)
|
|
local monster_vo = self.monster_vo_list[ins_id]
|
|
|
|
if monster_vo and monster_vo.is_client_monster then
|
|
return monster_vo
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
--删除指定类型的怪物,用于剧情
|
|
function SceneManager:DeleteClientMonstersByInstanceId(ins_id)
|
|
local monster_vo = self.monster_vo_list[ins_id]
|
|
if monster_vo and monster_vo.is_client_monster then
|
|
self:DeleteMonsterVo(ins_id, SceneManager.DELETE_MONSTER_BY_TYPE)
|
|
end
|
|
end
|
|
|
|
--删除指定类型的怪物,用于剧情
|
|
function SceneManager:DeleteClientMonstersByType(type_id)
|
|
for i, v in pairs(self.monster_vo_list) do
|
|
if v.type_id == type_id and v.is_client_monster then
|
|
self:DeleteMonsterVo(v.instance_id, SceneManager.DELETE_MONSTER_BY_TYPE)
|
|
end
|
|
end
|
|
end
|
|
|
|
function SceneManager:GetClientMonsterVoByTypeId(type_id)
|
|
for id, monster_vo in pairs(self.monster_vo_list) do
|
|
if monster_vo.type_id == type_id and monster_vo.is_client_monster then
|
|
return monster_vo
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function SceneManager:GetMonsterVoByTypeId(type_id)
|
|
for id, monster_vo in pairs(self.monster_vo_list) do
|
|
if monster_vo.type_id == type_id then
|
|
return monster_vo
|
|
end
|
|
end
|
|
local size = self.delay_monster_list:GetSize()
|
|
if size > 0 then
|
|
for index = 0, size - 1 do
|
|
local monster_vo = self.delay_monster_list:Get(index)
|
|
if monster_vo.type_id == type_id then
|
|
return monster_vo
|
|
end
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
--获取随机一个不等于not_instance_id的怪物
|
|
function SceneManager:GetRandomMonsterVoByTypeId(type_id, not_instance_id)
|
|
local tb = {}
|
|
for id, monster_vo in pairs(self.monster_vo_list) do
|
|
if monster_vo.type_id == type_id then
|
|
table_insert(tb, monster_vo)
|
|
end
|
|
end
|
|
if #tb > 1 then
|
|
local times = 0
|
|
while times<1000 do
|
|
times = times + 1
|
|
local rand = math.random(1, #tb)
|
|
if tb[rand] and tb[rand].instance_id~=not_instance_id then
|
|
return tb[rand]
|
|
end
|
|
end
|
|
elseif #tb==1 and tb[1].instance_id~=not_instance_id then --只有一只怪物
|
|
return tb[1]
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function SceneManager:GetDelayMonsterVo(ins_id)
|
|
local size = self.delay_monster_list:GetSize()
|
|
if size > 0 then
|
|
for index = 0, size - 1 do
|
|
local info = self.delay_monster_list:Get(index)
|
|
if info and ins_id == info.instance_id then
|
|
return info
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function SceneManager:GetDelayMonsterNum()
|
|
local size = self.delay_monster_list:GetSize()
|
|
return size
|
|
end
|
|
|
|
--从延迟加载列表中取一个vo并创建
|
|
function SceneManager:AddDelaydMonsterVo()
|
|
local size = self.delay_monster_list:GetSize()
|
|
if size > 0 then
|
|
local vo = self.delay_monster_list:PopFront()
|
|
self:AddMonsterVo(vo)
|
|
end
|
|
end
|
|
|
|
--[[@
|
|
功能: 根据怪物实例ID移除一个怪物Vo信息
|
|
参数:
|
|
ins_id 怪物实例ID int32
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
|
|
]]
|
|
SceneManager.DELETE_MONSTER_WAVE_RESET = 1
|
|
SceneManager.DELETE_MONSTER_BATTLE_GROUND = 2
|
|
SceneManager.DELETE_MONSTER_OUTLAND_WAR = 3
|
|
SceneManager.DELETE_MONSTER_RESULT_VIEW = 4
|
|
SceneManager.DELETE_MONSTER_DEAD = 5
|
|
SceneManager.DELETE_MONSTER_12006 = 6
|
|
SceneManager.DELETE_MONSTER_BY_TYPE = 7
|
|
SceneManager.DELETE_MONSTER_FIGHT_ERROR = 8
|
|
SceneManager.DELETE_MONSTER_AI = 9
|
|
|
|
function SceneManager:DeleteMonsterVo( ins_id , delete_type)
|
|
local size = self.delay_monster_list:GetSize()
|
|
local vo = self.monster_vo_list[ins_id]
|
|
local type_id = vo and vo.type_id
|
|
|
|
if vo == nil then
|
|
if size > 0 then
|
|
for index = 0, size - 1 do
|
|
local info = self.delay_monster_list:Get(index)
|
|
if info and ins_id == info.instance_id then
|
|
type_id = info.type_id
|
|
self.delay_monster_list:Erase(index)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
else
|
|
self:ClearRecordPreMonsterData(ins_id)
|
|
self.monster_vo_list[ins_id] = nil
|
|
end
|
|
if vo then
|
|
GlobalEventSystem:Fire(SceneEventType.MONSTER_VO_REMOVE, ins_id, type_id,vo)
|
|
end
|
|
return vo
|
|
end
|
|
|
|
function SceneManager:GetAllMonsterVo()
|
|
return self.monster_vo_list
|
|
end
|
|
|
|
function SceneManager:ClearAllMonsterVo()
|
|
for k, vo in pairs(self.monster_vo_list) do
|
|
GlobalEventSystem:Fire(SceneEventType.MONSTER_VO_REMOVE, vo.instance_id, vo.type_id,vo)
|
|
end
|
|
self.delay_monster_list = Array.New() --延迟加载的怪物列表
|
|
self.monster_vo_list = {}
|
|
end
|
|
|
|
function SceneManager:AddMonsterVoPool(vo)
|
|
if self.monster_vo_pool:GetSize() < 40 then
|
|
vo:ResetData()
|
|
self.monster_vo_pool:PushBack(vo)
|
|
end
|
|
end
|
|
|
|
function SceneManager:CreateMonsterVo()
|
|
if self.monster_vo_pool:GetSize() > 0 then
|
|
return self.monster_vo_pool:PopFront()
|
|
end
|
|
return MonsterVo.New()
|
|
end
|
|
|
|
function SceneManager:AddRoleVoPool(vo)
|
|
if self.role_vo_pool:GetSize() < 40 then
|
|
vo:ResetData()
|
|
self.role_vo_pool:PushBack(vo)
|
|
end
|
|
end
|
|
|
|
function SceneManager:CreateRoleVo()
|
|
if self.role_vo_pool:GetSize() > 0 then
|
|
return self.role_vo_pool:PopFront()
|
|
end
|
|
return RoleVo.New()
|
|
end
|
|
|
|
function SceneManager:AddOtherVo(other_vo)
|
|
self.other_vo_list[other_vo.instance_id] = other_vo
|
|
GlobalEventSystem:Fire(SceneEventType.OTHER_VO_ADD, other_vo.instance_id, other_vo)
|
|
end
|
|
|
|
function SceneManager:GetOtherVo( ins_id )
|
|
return self.other_vo_list[ins_id]
|
|
end
|
|
|
|
function SceneManager:DeleteOtherVo( ins_id)
|
|
local vo = self:GetOtherVo(ins_id)
|
|
if vo then
|
|
self.other_vo_list[ins_id] = nil
|
|
GlobalEventSystem:Fire(SceneEventType.OTHER_VO_REMOVE, ins_id, vo)
|
|
return vo
|
|
end
|
|
end
|
|
|
|
function SceneManager:GetAllOtherVo()
|
|
return self.other_vo_list
|
|
end
|
|
|
|
function SceneManager:ClearAllOtherVo()
|
|
for k, vo in pairs(self.other_vo_list) do
|
|
GlobalEventSystem:Fire(SceneEventType.OTHER_VO_REMOVE, vo.instance_id, vo)
|
|
end
|
|
self.other_vo_list = {}
|
|
end
|
|
|
|
function SceneManager:getMonsterList()
|
|
local ret = {}
|
|
for _, vo in pairs(self.monster_vo_list) do
|
|
table_insert(ret, vo)
|
|
end
|
|
|
|
local size = self.delay_monster_list:GetSize()
|
|
if size > 0 then
|
|
for index = 0, size - 1 do
|
|
local vo = self.delay_monster_list:Get(index)
|
|
table_insert(ret, vo)
|
|
end
|
|
end
|
|
return ret
|
|
end
|
|
|
|
--重置缓存角色vo的队列
|
|
function SceneManager:ResetCachedRoleList()
|
|
self:ClearDelayAllRoleVo() -- 清空 延迟加载的玩家数据
|
|
end
|
|
|
|
function SceneManager:AddRoleVo(role_vo, is_from_server)
|
|
local role_id = role_vo.role_id
|
|
local main_role_id = RoleManager.Instance:GetMainRoleId()
|
|
if role_id == main_role_id then
|
|
RoleManager.Instance.mainRoleInfo:ChangeFromVo(role_vo)
|
|
self.server_role_num = self.server_role_num + 1
|
|
return
|
|
end
|
|
|
|
--如果是从服务端发来的角色信息,就把角色vo缓存起来,分帧创建,切换场景清空
|
|
if is_from_server then
|
|
if self.role_vo_list[role_id] == nil then --新增的情况数量加一
|
|
self.server_role_num = self.server_role_num + 1
|
|
self:AddDelayRoleTable(role_vo)
|
|
return
|
|
end
|
|
end
|
|
if self.role_vo_list[role_id] == nil then --新增的情况数量加一
|
|
self.client_role_num = self.client_role_num + 1
|
|
end
|
|
self.role_vo_list[role_id] = role_vo
|
|
|
|
EventSystem.Fire(GlobalEventSystem,SceneEventType.ROLE_VO_ADD, role_id, role_vo)
|
|
|
|
|
|
role_vo.particle_priority = 2
|
|
end
|
|
|
|
|
|
--[[@
|
|
功能: 根据联合ID获取一个角色信息
|
|
参数:
|
|
role_id 角色联合ID int32
|
|
返回值:
|
|
角色信息 RoleVo
|
|
其它: 无
|
|
作者: deadline
|
|
]]
|
|
function SceneManager:GetRoleVo( role_id )
|
|
if role_id == RoleManager.Instance:GetMainRoleId() then
|
|
return RoleManager.Instance.mainRoleInfo
|
|
else
|
|
return self.role_vo_list[role_id]
|
|
end
|
|
end
|
|
|
|
--[[
|
|
功能:获取所有角色信息
|
|
参数:角色信息列表
|
|
其他:无
|
|
作者:xinyy
|
|
]]
|
|
function SceneManager:GetAllRoleVos( )
|
|
return self.role_vo_list
|
|
end
|
|
|
|
--[[@
|
|
功能: 根据联合ID从Manager中移除一个角色信息
|
|
参数:
|
|
role_id 角色联合ID int32
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
作者: deadline
|
|
]]
|
|
function SceneManager:DeleteRoleVo( role_id )
|
|
if role_id == RoleManager.Instance:GetMainRoleId() then
|
|
return
|
|
end
|
|
--删除延迟加载列表
|
|
self:DeleteDelayRoleVo(role_id)
|
|
|
|
if self.role_vo_list[role_id] ~= nil then
|
|
self.server_role_num = self.server_role_num - 1
|
|
self.client_role_num = self.client_role_num - 1
|
|
self.role_vo_list[role_id] = nil
|
|
GlobalEventSystem:Fire(SceneEventType.ROLE_VO_REMOVE, role_id)
|
|
end
|
|
end
|
|
|
|
--[[@
|
|
功能: 移除所有角色信息
|
|
参数:
|
|
无
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
作者: deadline
|
|
]]
|
|
|
|
function SceneManager:ClearAllRoleVo( )
|
|
for k, _ in pairs(self.role_vo_list) do
|
|
GlobalEventSystem:Fire(SceneEventType.ROLE_VO_REMOVE, k)
|
|
end
|
|
self.role_vo_list = {}
|
|
self.client_role_num = 0
|
|
self.server_role_num = 0
|
|
end
|
|
|
|
--立马加载角色
|
|
function SceneManager:ImmeAddRoleVo(role_id)
|
|
local delay_role_len = #self.delay_role_vo_list
|
|
local vo = nil
|
|
for i = 1, delay_role_len do
|
|
vo = self.delay_role_vo_list[i]
|
|
if vo.role_id == role_id then
|
|
table_remove(self.delay_role_vo_list, i)
|
|
self:AddRoleVo(vo)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 分帧加载玩家
|
|
function SceneManager:AddDelayRoleTable( role )
|
|
table_insert(self.delay_role_vo_list, role)
|
|
end
|
|
|
|
function SceneManager:AddDelayRoleVo()
|
|
--限制场景最大数量
|
|
if self.client_role_num >= self.role_limit_num then
|
|
return
|
|
end
|
|
|
|
local n = #self.delay_role_vo_list
|
|
if n > 0 then
|
|
local role_vo = self.delay_role_vo_list[n]
|
|
self.delay_role_vo_list[n] = nil
|
|
self:AddRoleVo(role_vo)
|
|
end
|
|
end
|
|
|
|
--删除延迟加载列表
|
|
function SceneManager:DeleteDelayRoleVo(role_id)
|
|
local delay_role_len = #self.delay_role_vo_list
|
|
local vo = nil
|
|
for i = 1, delay_role_len do
|
|
vo = self.delay_role_vo_list[i]
|
|
if vo.role_id == role_id then
|
|
table_remove(self.delay_role_vo_list,i)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 2020年9月12日新增 某些状态改变的逻辑要获取到未加载的vo
|
|
function SceneManager:GetDelayRoleVo(role_id)
|
|
local delay_role_len = #self.delay_role_vo_list
|
|
local vo = nil
|
|
for i = 1, delay_role_len do
|
|
vo = self.delay_role_vo_list[i]
|
|
if vo.role_id == role_id then
|
|
return vo
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function SceneManager:GetDelayRoleNum()
|
|
return #self.delay_role_vo_list
|
|
end
|
|
|
|
function SceneManager:ClearDelayAllRoleVo()
|
|
self.delay_role_vo_list = {}
|
|
end
|
|
|
|
--获取除了主角以外的场景对象
|
|
function SceneManager:GetSceneObjVo(instance_id)
|
|
local vo = SceneManager.Instance:GetMonsterVo(instance_id)
|
|
if vo then
|
|
return vo, SceneBaseType.Monster
|
|
end
|
|
vo = SceneManager.Instance:GetRoleVo(instance_id)
|
|
or SceneManager.Instance:GetOtherVo(instance_id)
|
|
return vo
|
|
end
|
|
|
|
--创建分身
|
|
function SceneManager:CreateCloneRole(role_id, x, y, horse_id, birth_angle, name, head_wear_id)
|
|
local mvo = self:GetRoleVo(role_id)
|
|
if mvo == nil then
|
|
print("分身的主体死了,不能再创建分身")
|
|
return
|
|
end
|
|
local vo = RoleVo.New()
|
|
self.clone_role_id_count = self.clone_role_id_count + 1
|
|
|
|
vo.role_id = self.clone_role_start_id + self.clone_role_id_count --用户ID(int32)
|
|
vo.plat_name = mvo.plat_name --平台名(string)
|
|
vo.server_id = mvo.server_id --服ID(int16)
|
|
vo.name = name or "" --玩家名(string)
|
|
vo.pos_x = x or mvo.pos_x --X像素坐标(int16)
|
|
vo.pos_y = y or mvo.pos_y --Y像素坐标(int16)
|
|
|
|
vo.level = 1
|
|
vo.hp = mvo.hp
|
|
vo.maxHp = mvo.maxHp
|
|
vo.career = mvo.career
|
|
vo.move_speed = mvo.move_speed
|
|
vo.vip_flag = mvo.vip_flag
|
|
vo.fighting = mvo.fighting
|
|
vo.imageId = mvo.imageId
|
|
vo.warGroup = mvo.warGroup
|
|
vo.head_wear_id = mvo.head_wear_id
|
|
vo.birth_angle = birth_angle or 0
|
|
|
|
vo.fashion_model_list = mvo.fashion_model_list
|
|
vo.level_model_list = mvo.level_model_list
|
|
vo.horse_id = horse_id
|
|
vo.is_ride = 1
|
|
vo.is_virtual_friend = true
|
|
vo.create_time = Status.NowTime
|
|
self:AddRoleVo(vo)
|
|
return vo.role_id
|
|
end
|
|
|
|
function SceneManager:AddPartnerVo(partner_vo)
|
|
local partner_id = partner_vo.partner_id
|
|
|
|
self.partner_vo_list[partner_id] = partner_vo
|
|
GlobalEventSystem:Fire(SceneEventType.PARTNER_VO_ADD, partner_id, partner_vo)
|
|
|
|
partner_vo.particle_priority = 2
|
|
end
|
|
|
|
function SceneManager:GetPartnerVo( partner_id )
|
|
return self.partner_vo_list[partner_id]
|
|
end
|
|
|
|
function SceneManager:GetAllPartnerVos( )
|
|
return self.partner_vo_list
|
|
end
|
|
|
|
function SceneManager:DeletePartnerVo( partner_id )
|
|
local vo = self:GetPartnerVo(partner_id)
|
|
if vo ~= nil then
|
|
self.partner_vo_list[partner_id] = nil
|
|
GlobalEventSystem:Fire(SceneEventType.PARTNER_VO_REMOVE, partner_id)
|
|
return vo
|
|
end
|
|
end
|
|
|
|
function SceneManager:ClearAllPartnerVo( )
|
|
for k, _ in pairs(self.partner_vo_list) do
|
|
GlobalEventSystem:Fire(SceneEventType.PARTNER_VO_REMOVE, k)
|
|
end
|
|
self.partner_vo_list = {}
|
|
end
|
|
|
|
|
|
function SceneManager:IsBlockXY(x, y, jump_state)
|
|
local state = MapView:getInstance():IsBlockXY(x,y,jump_state)
|
|
return state
|
|
end
|
|
|
|
function SceneManager:IsAreaType(x, y, area_type)
|
|
local state = MapView:getInstance():IsAreaType(x,y,area_type)
|
|
return state
|
|
end
|
|
|
|
function SceneManager:CheckIsInScreen(x, y)
|
|
local camera_pos = MainCamera.Instance:GetCameraPos()
|
|
local ratio = MainCamera.Instance:GetCameraRatio()
|
|
-- print(x,y,camera_pos.x,camera_pos.y,camera_pos.x - ScreenWidth * 0.5 * ratio,camera_pos.x + ScreenWidth * 0.5 * ratio,camera_pos.y - ScreenHeight * 0.3 * ratio,camera_pos.y + ScreenHeight * 0.8 * ratio)
|
|
if x < (camera_pos.x - ScreenWidth * 0.5 * ratio) or x > (camera_pos.x + ScreenWidth * 0.5 * ratio) or y < (camera_pos.y - ScreenHeight * 0.8 * ratio) or y > (camera_pos.y + ScreenHeight * 1 * ratio) then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
function SceneManager:GetAngle(pos1, pos2, real_pos)
|
|
local x = 0
|
|
local y = 0
|
|
if real_pos then
|
|
x = pos2.x - pos1.x
|
|
y = pos2.y - pos1.y
|
|
else
|
|
x = pos1
|
|
y = pos2
|
|
end
|
|
|
|
local hyp = math_sqrt(math_pow(x, 2) + math_pow(y, 2))
|
|
if hyp == 0 then
|
|
return 0
|
|
end
|
|
local cos = x / hyp
|
|
local radian = math_acos(cos)
|
|
if radian == 0 then
|
|
return 0
|
|
end
|
|
local angle = 180 / (math_pi / radian)
|
|
if y < 0 then
|
|
angle = 360 - angle
|
|
end
|
|
return math_floor(angle + 0.5)
|
|
end
|
|
|
|
--得到textureshader 普通模型的默认shader 无alpha透明通道
|
|
function SceneManager:GetTextureShader()
|
|
if self.texture_shader == nil then
|
|
self.texture_shader = Shader.Find( "Unlit/Texture")
|
|
end
|
|
return self.texture_shader
|
|
end
|
|
|
|
--得到Alphatextureshader 有alpha透明通道 已经可以更改颜色
|
|
function SceneManager:GetColorTextureShader()
|
|
if self.color_texture_shader == nil then
|
|
self.color_texture_shader = ShaderTools.GetShader("Alpha_shader")
|
|
end
|
|
return self.color_texture_shader
|
|
end
|
|
|
|
--变灰shader
|
|
function SceneManager:GetGrayShader()
|
|
if self.gray_shader == nil then
|
|
self.gray_shader = ShaderTools.GetShader("Gray_level_shader")
|
|
end
|
|
return self.gray_shader
|
|
end
|
|
|
|
function SceneManager:SetGrayShader(monster_id,material,shader)
|
|
shader = shader or self:GetGrayShader()
|
|
if monster_id and material then
|
|
material.shader = shader
|
|
local config = Config.ConfigModelGray.info[monster_id] or Config.ConfigModelGray.info.default
|
|
if config then
|
|
--Unlit - Texture 自带一个灰度颜色,要重置
|
|
material:SetColor("_Color",Color(1,1,1,1))
|
|
material:SetFloat("_inBlack",config.input_black)
|
|
material:SetFloat("_inGamma",config.input_gamma)
|
|
material:SetFloat("_inWhite",config.input_white)
|
|
material:SetFloat("_outWhite",config.output_white)
|
|
material:SetFloat("_outBlack",config.output_black)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
--[[
|
|
--模型UI遮罩Shader 根据本身shader,获取对应的遮罩shader
|
|
function SceneManager:GetModelMaskShader(cur_shader_name)
|
|
if cur_shader_name == "Unlit/Texture" or cur_shader_name == "Unlit/AlphaTexture" then
|
|
self.modelMask_shader = ShaderTools.GetShader("Unlit_Texture_Mask") --普通无光材质
|
|
elseif cur_shader_name == "Custom/mb_flowalphablendmask" or cur_shader_name == "Custom/mb_flowalphablendmask_transparentculloff" or cur_shader_name == "Custom/mb_flowalphablendmaskui" then
|
|
self.modelMask_shader = ShaderTools.GetShader("mb_flowalphablendmask_mask") --波塞冬的水波纹材质
|
|
elseif cur_shader_name == "Custom/mb_uvrolladd_culloff" then
|
|
self.modelMask_shader = ShaderTools.GetShader("mb_uvrolladd_culloff_mask")
|
|
elseif cur_shader_name == "Custom/mb_uvrollalphablend_culloff" or cur_shader_name == "Custom/mb_uvrollalphablend" then
|
|
self.modelMask_shader = ShaderTools.GetShader("mb_uvrollalphablend_culloff_mask")
|
|
elseif cur_shader_name == "Particles/Additive" or cur_shader_name == "Mobile/Particles/Additive" or cur_shader_name == "NoFog/Particles/Additive" then
|
|
self.modelMask_shader = ShaderTools.GetShader("ParticleAdd_mask")
|
|
elseif cur_shader_name == "Particles/Blend" then
|
|
self.modelMask_shader = ShaderTools.GetShader("ParticleBlend_mask")
|
|
elseif cur_shader_name == "Particles/Alpha Blended" or cur_shader_name == "Mobile/Particles/Alpha Blended" or cur_shader_name == "NoFog/Particles/Alpha Blended"or cur_shader_name == "NoFog/Mobile/Particles/Alpha Blended" then
|
|
self.modelMask_shader = ShaderTools.GetShader("ParticleAlphaBlend_mask")
|
|
elseif cur_shader_name == "Custom/mb_uvrolladd" then
|
|
self.modelMask_shader = ShaderTools.GetShader("mb_uvrolladd_mask")
|
|
else
|
|
return nil
|
|
end
|
|
return self.modelMask_shader
|
|
end
|
|
|
|
--设置UI遮罩模型
|
|
-- mask_img ui遮罩
|
|
-- model_root 需要遮罩的模型根对象
|
|
-- part_name 需要遮罩的模型部件,因为有些模型是有很多挂件的,比如武器,翅膀,可以针对模型的部件进行遮罩
|
|
-- mask_Tex 遮罩的mask,如果不传,默认用 mask_img 的sprite
|
|
function SceneManager:SetModelMaskShader(mask_img,model_root,part_name,mask_Tex)
|
|
if not model_root or not model_root.gameObject or not mask_img then
|
|
-- print("参数错误 mask_img: "..mask_img.." model_root: ",model_root.gameObject)
|
|
return
|
|
end
|
|
local target_root
|
|
if part_name then
|
|
target_root = model_root.gameObject.transform:Find(part_name) --rhand
|
|
else
|
|
target_root = model_root.transform --rhand
|
|
end
|
|
if target_root then
|
|
self:SetModelMaskShaderInEveryChild(target_root,mask_img,mask_Tex)
|
|
else
|
|
print("没有找到对应的挂件 ",part_name)
|
|
end
|
|
end
|
|
|
|
function SceneManager:SetModelMaskShaderInEveryChild(root,mask_img,mask_Tex)
|
|
self:SetSingleModelMaskShader(root,mask_img,mask_Tex)
|
|
if root.childCount > 0 then
|
|
for i=0,root.childCount - 1 do
|
|
self:SetModelMaskShaderInEveryChild(root:GetChild(i),mask_img,mask_Tex)
|
|
end
|
|
end
|
|
end
|
|
|
|
function SceneManager:SetSingleModelMaskShader(target,mask_img,mask_Tex)
|
|
|
|
local coms = target.gameObject:GetComponent(typeof(UnityEngine.Renderer))
|
|
self:SetSingleModelMaskShaderWithCom(coms,mask_img,mask_Tex)
|
|
end
|
|
|
|
function SceneManager:SetSingleModelMaskShaderWithCom(com,mask_img,mask_Tex)
|
|
if not com then
|
|
return
|
|
end
|
|
for i = 0, com.materials.Length - 1 do
|
|
local material = com.materials[i] --这里不能用 sharedMaterial 不能改变他原有的shader,只是临时改变
|
|
local shader = self:GetModelMaskShader(material.shader.name)
|
|
-- print("寻找对应的shader "..material.shader.name,shader.name)
|
|
if string.find (material.shader.name,"UIMask") then
|
|
return
|
|
end
|
|
if not shader then
|
|
print("没有找到对应的Shader "..material.shader.name)
|
|
return
|
|
end
|
|
local rectTran = mask_img:GetComponent("RectTransform")
|
|
local img = mask_img:GetComponent("Image")
|
|
if not img then
|
|
print("没有找到遮罩组件 Image")
|
|
return
|
|
end
|
|
material.shader = shader
|
|
local corners = ToVector3Array({Vector3,Vector3,Vector3,Vector3})
|
|
if not corners then
|
|
print("Vector3返回空值,请更新版本")
|
|
return
|
|
end
|
|
rectTran:GetWorldCorners(corners)
|
|
local minX = corners[0].x;
|
|
local minY = corners[0].y;
|
|
local maxX = corners[2].x;
|
|
local maxY = corners[2].y;
|
|
material:SetTexture("_MaskTex",mask_Tex or img.sprite.texture);
|
|
material:SetFloat("_MinX", minX);
|
|
material:SetFloat("_MinY", minY);
|
|
material:SetFloat("_MaxX", maxX);
|
|
material:SetFloat("_MaxY", maxY);
|
|
end
|
|
end
|
|
|
|
]]
|
|
|
|
|
|
|
|
|
|
-----------------------------------------场景判断---------------------------------
|
|
function SceneManager:GetCacheSceneType( )
|
|
if rawget(self, "cache_scene_type") then
|
|
return self.cache_scene_type, self.cache_scene_broadcast
|
|
end
|
|
local info = self:GetSceneInfo()
|
|
if not info then
|
|
return
|
|
end
|
|
self.cache_scene_type = info.type
|
|
self.cache_scene_broadcast = info.broadcast and info.broadcast == 1
|
|
return self.cache_scene_type, self.cache_scene_broadcast
|
|
end
|
|
|
|
function SceneManager:ResetCacheSceneType( )
|
|
self.cache_scene_type = false
|
|
self.cache_scene_broadcast = false
|
|
end
|
|
|
|
--[[
|
|
功能:是否新手副本场景id
|
|
]]
|
|
function SceneManager:IsFirstScene()
|
|
return false
|
|
end
|
|
|
|
--[[
|
|
功能:是否在副本
|
|
]]
|
|
function SceneManager:IsMission()
|
|
return self:GetCurrDunId() ~= 0
|
|
end
|
|
|
|
--[[
|
|
功能:是否在主城或者野外或社团场景
|
|
]]
|
|
function SceneManager:IsMainCityorYieldScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return sceneInfo and (sceneInfo.type == 0 or sceneInfo.type == 1 or sceneInfo.type == 4)
|
|
end
|
|
|
|
--[[
|
|
功能:是否在主城或者野外(不包括社团)
|
|
]]
|
|
function SceneManager:IsMainCityorYieldSceneNotGuild(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return sceneInfo and (sceneInfo.type == 0 or sceneInfo.type == 1)
|
|
end
|
|
|
|
--[[
|
|
功能:判断当前场景是否为安全场景 不能释放一切技能
|
|
]]
|
|
function SceneManager:IsSafeScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and sceneInfo.subtype == 1)
|
|
end
|
|
|
|
--是否安全区域 (包括安全场景和安全位置坐标)
|
|
function SceneManager:IsSafeArea(scene_id, pos_x, pos_y)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return self:IsSafeScene(scene_id) or (self:IsSafePos(pos_x, pos_y))
|
|
end
|
|
|
|
--是否处于安全区坐标,野外场景也会有安全区的
|
|
function SceneManager:IsSafePos(pos_x, pos_y)
|
|
if pos_x == nil or pos_y == nil then
|
|
return false
|
|
end
|
|
local is_safe_area = self:IsAreaType(pos_x / SceneObj.LogicRealRatio.x, pos_y / SceneObj.LogicRealRatio.y, AreaDataIndex.SafeType)
|
|
return is_safe_area
|
|
end
|
|
|
|
--是否有障碍区
|
|
function SceneManager:HasBolckScene(scene_id)
|
|
return false
|
|
end
|
|
|
|
--是否处于障碍区
|
|
function SceneManager:IsBlockPos(pos_x, pos_y)
|
|
return false
|
|
end
|
|
|
|
--pk场景 强制切换pk状态
|
|
function SceneManager:IsPKScene(scene_id)
|
|
return not self:IsOnlyAttackMonsterScene(scene_id)
|
|
end
|
|
|
|
--不能攻击其他玩家 只能打怪的场景
|
|
function SceneManager:IsOnlyAttackMonsterScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.subtype == 1))
|
|
end
|
|
|
|
function SceneManager:IsCSPvP(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 6000
|
|
end
|
|
|
|
function SceneManager:IsAutoFindWayScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 10003
|
|
or scene_id == 10003
|
|
or scene_id == 10000
|
|
end
|
|
|
|
function SceneManager:IsAutoFindWayDun(dun_id)
|
|
dun_id = dun_id or self:GetCurrDunId()
|
|
return dun_id == 1003
|
|
end
|
|
|
|
--Pk场景准备阶段
|
|
function SceneManager:IsNotBlockMonsterScene()
|
|
return self:IsPkBattleScene()
|
|
end
|
|
|
|
--Pk场景准备阶段
|
|
function SceneManager:IsNotShowOtherHeadScene()
|
|
return self:IsPkBattleScene() or self:IsCSPvP()
|
|
end
|
|
|
|
--星界试炼场景
|
|
function SceneManager:IsStarFightScene(scene_id)
|
|
-- if scene_id == nil and self.temp_check_list["IsStarFightScene"] ~= nil then
|
|
-- return self.temp_check_list["IsStarFightScene"]
|
|
-- end
|
|
-- local save = false
|
|
-- if scene_id == nil then
|
|
-- save = true
|
|
-- end
|
|
-- scene_id = scene_id or self:GetSceneId()
|
|
-- for k,v in pairs(Config.Pokemonwarbirth) do
|
|
-- if tonumber(scene_id) == v.id then
|
|
-- if save then
|
|
-- self.temp_check_list["IsStarFightScene"] = true
|
|
-- end
|
|
-- return true
|
|
-- end
|
|
-- end
|
|
-- if save then
|
|
-- self.temp_check_list["IsStarFightScene"] = false
|
|
-- end
|
|
-- return false
|
|
end
|
|
|
|
--Pk场景准备阶段
|
|
function SceneManager:IsPkSceneReadyStep()
|
|
if self:IsPkBattleScene() then
|
|
if PkBattleModel:getInstance():IsInReadyStep() then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function SceneManager:IsOvnWaitingScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
if scene_id == 7112 then
|
|
return 1
|
|
elseif scene_id == 7113 then
|
|
return 2
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function SceneManager:IsOvnFightingScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
if scene_id == 7110 then
|
|
return 1
|
|
elseif scene_id == 7111 then
|
|
return 2
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
|
|
--显示pk模式ui的场景
|
|
function SceneManager:ShowPKStatusUI(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.subtype == 0)
|
|
and RoleManager.Instance.mainRoleInfo.warGroup == 0)
|
|
end
|
|
|
|
--能否切换PK模式的场景
|
|
function SceneManager:IsCanChangePKStatusScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.subtype == 0))
|
|
end
|
|
|
|
function SceneManager:ShowPkTipsScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.pkstate == 1 or sceneInfo.pkstate == 2) and not self:IsDiamondFightScene() and not self:IsOvnFightingScene())
|
|
end
|
|
|
|
--显示跟随npc的场景
|
|
function SceneManager:ShowFollowNpc(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.type == 0 or sceneInfo.type == 1) )
|
|
end
|
|
|
|
--不能跳跃障碍点的场景
|
|
function SceneManager:CannotJumpCrossBlockScene()
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.type == 3))
|
|
end
|
|
|
|
--任务可以加速的场景
|
|
function SceneManager:TaskCanAddSpeedBuffScene()
|
|
return self:IsMainCityorYieldScene()
|
|
end
|
|
|
|
--在主城安全区
|
|
function SceneManager:IsMainCity(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.type == 0 and sceneInfo.subtype == 1))
|
|
end
|
|
|
|
--没有操作cd的场景
|
|
function SceneManager:NoOperateCDScene()
|
|
if self:IsMainCity() or ((self:IsOnlyAttackMonsterScene() or self:IsSafeScene()) and self:IsOutdoorScene()) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
--是否可以使用飞鞋的场景(主城,野外场景中的子类型为0和1的场景)
|
|
function SceneManager:IsCanUseFlyShoeScene()
|
|
return self:IsMainCityAndFieldScene() or self:IsRefineDungeon() or self:IsCSPvP() or self:IsPkBattleScene() or self:IsHomeBuildScene()
|
|
end
|
|
|
|
--隐藏连击效果的场景
|
|
function SceneManager:HideLianjiScene(scene_id)
|
|
return true
|
|
end
|
|
|
|
--是否野外场景
|
|
function SceneManager:IsOutdoorScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and sceneInfo.type == 1)
|
|
end
|
|
|
|
function SceneManager:IsBeachScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == BeachModel:GetInstance():GetKeyValue("kf_scene")
|
|
or scene_id == BeachModel:GetInstance():GetKeyValue("bf_scene")
|
|
end
|
|
|
|
function SceneManager:IsPkRankFightScene(scene_id)
|
|
-- local sceneInfo = self:GetSceneInfo(scene_id)
|
|
-- return (sceneInfo and sceneInfo.type == 9)
|
|
return self:IsMirrorPkRankScene()
|
|
end
|
|
|
|
function SceneManager:IsTopPkScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id >= 4053 and scene_id <= 4054
|
|
end
|
|
|
|
function SceneManager:IsStarDungeonScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 5502
|
|
end
|
|
|
|
--是否副本场景
|
|
function SceneManager:IsDungeonScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
if sceneInfo then
|
|
return sceneInfo.type == 2 and self:IsMirrorDungeonScene()
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
--是否沙盘副本场景
|
|
function SceneManager:IsSandTableDungeonScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
if sceneInfo then
|
|
for k,v in pairs(Config.Dungeoncfg) do
|
|
if v.scene_id == scene_id then
|
|
return v.type == BaseDungeonModel.DUN_TYPE.SandTable
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--是否镜像竞技场
|
|
function SceneManager:IsMirrorPkRankScene()
|
|
return self.mirror_scene_id == SceneActivityMirrorSceneId.PkRank
|
|
end
|
|
|
|
--是否是镜像场景
|
|
function SceneManager:IsMirrorScene()
|
|
return self.mirror_scene_id ~= SceneActivityMirrorSceneId.None
|
|
end
|
|
|
|
--上一个场景是否是镜像场景
|
|
function SceneManager:IsLastMirrorScene()
|
|
return self.last_mirror_scene_id ~= SceneActivityMirrorSceneId.None
|
|
end
|
|
|
|
--是否镜像副本
|
|
function SceneManager:IsMirrorDungeonScene()
|
|
return self.mirror_scene_id == SceneActivityMirrorSceneId.Dungeon or self.mirror_scene_id == SceneActivityMirrorSceneId.None or self.mirror_scene_id == SceneActivityMirrorSceneId.DungeonMany
|
|
end
|
|
|
|
--设置镜像镜像场景
|
|
function SceneManager:SetMirrorSceneId(mirror_scene_id)
|
|
self.last_mirror_scene_id = self.mirror_scene_id
|
|
self.mirror_scene_id = mirror_scene_id
|
|
end
|
|
|
|
--获取镜像场景id
|
|
function SceneManager:GetMirrorSceneId(mirror_scene_id)
|
|
return self.mirror_scene_id
|
|
end
|
|
|
|
--退出副本场景的时候是否弹出结算界面(默认不弹出)
|
|
function SceneManager:IsShowDungeonResultOnExit(dun_id)
|
|
local show = false
|
|
local resultData = BaseDungeonModel:getInstance():GetDunResultInfo()
|
|
if resultData.result == 1 or (self:IsGuardianThreeDun(dun_id) and DunManyModel:getInstance().is_support_state == 1 and resultData.wave and resultData.wave > 5) then--场景外只有胜利弹
|
|
if self:IsCrusadeDun(dun_id) or self:IsGuardianThreeDun(dun_id) then
|
|
show = true
|
|
end
|
|
elseif resultData.result == 2 then--多人副本场景外如果是失败了也要弹
|
|
if self:IsCrusadeDun(dun_id) or self:IsGuardianThreeDun(dun_id) then
|
|
show = true
|
|
end
|
|
end
|
|
return show
|
|
end
|
|
|
|
--退出副本场景内的时候是否弹出结算界面
|
|
function SceneManager:ShowDungeonResultOnDun(dun_id)
|
|
local show = true
|
|
local resultData = BaseDungeonModel:getInstance():GetDunResultInfo()
|
|
local exit_by_hand = BaseDungeonModel:getInstance().exit_by_hand
|
|
-- --无尽回廊只有失败的时候才在副本场景外面弹结算界面
|
|
-- if self:IsOneTowerDungeon(dun_id) and BaseDungeonModel:getInstance():GetDunResultInfo().result ~= 2 then
|
|
-- show = false
|
|
-- --主线副本默认不弹结算界面
|
|
-- else
|
|
-- print("huangcong:SceneManager [start:1799] :", resultData)
|
|
-- PrintTable(resultData)
|
|
-- print("huangcong:SceneManager [end]")
|
|
if self:IsThreadDungeon(dun_id) or self:IsNomalDungeon(dun_id) or self:IsEscortDungeon() then--主线副本不弹结算界面
|
|
show = false
|
|
elseif resultData and resultData.result == 2 and resultData.result_subtype ~= 1 then--失败结算
|
|
if exit_by_hand and (
|
|
self:IsMaterialDungeon(dun_id) or self:IsVIPDungeon(dun_id) or self:IsOneTowerDungeon(dun_id)
|
|
) then
|
|
show = false
|
|
end
|
|
end
|
|
return show
|
|
end
|
|
|
|
--是否跨服入侵场景
|
|
function SceneManager:IsIntrusionScene(scene_id)
|
|
-- local sceneInfo = self:GetSceneInfo(scene_id)
|
|
-- if sceneInfo then
|
|
-- return sceneInfo.type == 16
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
--是否是在跨服场景 .加入会自动添加 区服 攻击模式、在名字前加服务器标识
|
|
function SceneManager:InServerScene(scene_id)
|
|
return self:IsCrusadeScene(scene_id)
|
|
or self:IsCSEndlessScene(scene_id)
|
|
or self:IsBeachScene(scene_id)
|
|
or self:IsKfWordScene(scene_id)
|
|
or self:IsGuildCSGRScene(scene_id)
|
|
or self:IsCSGWarScene(scene_id)
|
|
or self:IsCSWastelandScene(scene_id)
|
|
or self:IsRageWarCrossServerScene(scene_id)
|
|
or self:IsDesertedBossCrossScene(scene_id)
|
|
or self:IsJumpOneScene(scene_id)
|
|
end
|
|
|
|
--是否跨服入侵 世界主城 场景
|
|
function SceneManager:IsIntrusionWorldHoneScene(scene_id)
|
|
-- scene_id = scene_id or self:GetSceneId()
|
|
-- local sceneInfo = self:GetSceneInfo(scene_id)
|
|
-- if sceneInfo then
|
|
-- return sceneInfo.type == 17
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
--是否彩钻大战战斗
|
|
function SceneManager:IsDiamondFightScene(scene_id)
|
|
-- local scene_id = scene_id or self:GetSceneId()
|
|
-- local config = Config.Drumwarkv[5]
|
|
-- local list = ErlangParser:GetInstance():Parse(config.val)
|
|
-- scene_id = tostring(scene_id)
|
|
-- for i,v in pairs(list) do
|
|
-- if v == scene_id then
|
|
-- return true
|
|
-- end
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
--是否彩钻大战等待
|
|
function SceneManager:IsDiamondFightWaitingScene(scene_id)
|
|
-- local scene_id = scene_id or self:GetSceneId()
|
|
-- local config = Config.Drumwarkv[4]
|
|
-- local list = ErlangParser:GetInstance():Parse(config.val)
|
|
-- scene_id = tostring(scene_id)
|
|
-- for i,v in pairs(list) do
|
|
-- if v == scene_id then
|
|
-- return true
|
|
-- end
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
--是否是彩钻大战任意一个场景(等待或者战斗)
|
|
function SceneManager:IsAnyDiamonScene(scene_id)
|
|
return self:IsDiamondFightWaitingScene(scene_id) or self:IsDiamondFightScene(scene_id)
|
|
end
|
|
|
|
--是否星灵争霸战斗
|
|
function SceneManager:IsSpiritWarScene(scene_id)
|
|
-- local scene_id = scene_id or self:GetSceneId()
|
|
-- local config = Config.Pokemondrumkv[8]
|
|
-- if config then
|
|
-- local list = ErlangParser:GetInstance():Parse(config.val)
|
|
-- scene_id = tostring(scene_id)
|
|
-- for i,v in pairs(list) do
|
|
-- if v == scene_id then
|
|
-- return true
|
|
-- end
|
|
-- end
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
--是否星灵争霸等待
|
|
function SceneManager:IsSpiritWarWaitingScene(scene_id)
|
|
-- local scene_id = scene_id or self:GetSceneId()
|
|
-- local config = Config.Pokemondrumkv[7]
|
|
-- if config then
|
|
-- local list = ErlangParser:GetInstance():Parse(config.val)
|
|
-- scene_id = tostring(scene_id)
|
|
-- for i,v in pairs(list) do
|
|
-- if v == scene_id then
|
|
-- return true
|
|
-- end
|
|
-- end
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
--是否是星灵争霸任意一个场景(等待或者战斗)
|
|
function SceneManager:IsAnySpiritWarScene(scene_id)
|
|
return self:IsSpiritWarScene(scene_id) or self:IsSpiritWarWaitingScene(scene_id)
|
|
end
|
|
|
|
--是否是能获得经验的副本
|
|
function SceneManager:CanGetExpDungeonScene(scene_id)
|
|
return self:IsExpScene(scene_id)--[[ or self:IsGuildGuardDungeon(scene_id)--]]
|
|
end
|
|
|
|
--普通副本
|
|
function SceneManager:IsNomalDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.MORMAL or dunConfig.type == BaseDungeonModel.DUN_TYPE.PSIONIC
|
|
end
|
|
end
|
|
|
|
--是否是经验跑环副本副本
|
|
function SceneManager:IsDailyCircleDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.MORMAL and dunConfig.sub_type == BaseDungeonModel.DUN_SUB_TYPE.DAILY_CIRCLE_DUN
|
|
end
|
|
end
|
|
|
|
|
|
--护送副本
|
|
function SceneManager:IsEscortDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.Escort
|
|
end
|
|
end
|
|
|
|
|
|
--主线副本
|
|
function SceneManager:IsThreadDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.THREAD
|
|
end
|
|
end
|
|
|
|
--进阶副本
|
|
function SceneManager:IsMaterialDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.MATERIAL
|
|
end
|
|
end
|
|
|
|
--VIP副本
|
|
function SceneManager:IsVIPDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.VIP
|
|
end
|
|
end
|
|
|
|
--爬塔副本
|
|
function SceneManager:IsOneTowerDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.ONE_TOWER
|
|
end
|
|
end
|
|
|
|
--简单爬塔副本
|
|
function SceneManager:IsOneTowerNormalDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
if dunConfig.type == BaseDungeonModel.DUN_TYPE.ONE_TOWER and not Config.Towerdundiffcult[dun_id] then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--爬塔副本
|
|
function SceneManager:IsOneTowerScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 7001
|
|
end
|
|
|
|
--主线材料副本
|
|
function SceneManager:IsMainPlotDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.MAINPLOT
|
|
end
|
|
end
|
|
|
|
--守卫幼宠(宠物副本)
|
|
function SceneManager:IsPetDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.PET
|
|
end
|
|
end
|
|
|
|
--唤神副本
|
|
function SceneManager:IsGodDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.GOD
|
|
end
|
|
end
|
|
|
|
|
|
function SceneManager:IsEliteAssessDun(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.EliteAssess
|
|
end
|
|
end
|
|
|
|
-- 是否是古神灭世神座体验副本
|
|
function SceneManager:IsGAExperienceDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
return dun_id >= 3600 and dun_id <= 3604 -- 暂时写死
|
|
end
|
|
|
|
--沙盘副本
|
|
function SceneManager:IsSandTableDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.SandTable
|
|
end
|
|
end
|
|
|
|
function SceneManager:IsEquipScene(dun_id)
|
|
-- local dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.EQUIP
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
--普通副本
|
|
function SceneManager:IsNormalDungeonScene(dun_id)
|
|
-- local dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == 0
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
function SceneManager:IsRebuildDungeon(dun_id)
|
|
-- local dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.REBUILD
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
function SceneManager:IsExpScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 3001
|
|
end
|
|
-- 是否是经验副本
|
|
function SceneManager:IsExpDun( dun_id )
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.EXP
|
|
end
|
|
end
|
|
|
|
-- 是否是讨伐小队
|
|
function SceneManager:IsCrusadeDun( dun_id )
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.Crusade
|
|
end
|
|
end
|
|
|
|
-- 是否是多人副本场景
|
|
function SceneManager:IsCrusadeScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return (scene_id >= 8000 and scene_id <= 8010) or scene_id == 3100
|
|
end
|
|
|
|
-- 是否是绝地守卫
|
|
function SceneManager:IsGuardianThreeDun( dun_id )
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.GuardianThree
|
|
end
|
|
end
|
|
|
|
-- 是否是幻光副本
|
|
function SceneManager:IsIllusoryLightDun( dun_id )
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.IllusoryLight
|
|
end
|
|
end
|
|
|
|
-- 是否是宝宝副本
|
|
function SceneManager:IsBabyDun( dun_id )
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.BABY
|
|
end
|
|
end
|
|
|
|
-- 是否是专属副本
|
|
function SceneManager:IsBossPersonDun( dun_id )
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.PersonBoss
|
|
end
|
|
end
|
|
|
|
function SceneManager:IsBabyScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 2300
|
|
end
|
|
|
|
-- 是否是星辰副本
|
|
function SceneManager:IsGalaxyDun( dun_id )
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.GALAXY
|
|
end
|
|
end
|
|
|
|
-- 是否是星辰副本
|
|
function SceneManager:IsSupportGuildBoss( dun_id )
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.SupportGuildBoss
|
|
end
|
|
end
|
|
|
|
|
|
function SceneManager:IsTeamDungeonScene(scene_id)
|
|
-- local dun_id = scene_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.EQUIP
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.REFINE
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.LOVE
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.REBUILD
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
--是否需要鼓舞技能的场景
|
|
function SceneManager:IsInspireScene(scene_id)
|
|
return self:IsTeamDungeonScene() or self:IsExpScene() or self:IsStarDungeon()
|
|
end
|
|
|
|
function SceneManager:IsSingleDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return
|
|
-- dunConfig.type == BaseDungeonModel.DUN_TYPE.COIN
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.GODHOOD
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.GOD
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.GEM
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.EXP
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.NEWIE_EXP
|
|
-- or dunConfig.type == BaseDungeonModel.DUN_TYPE.STAR_FIGHT
|
|
-- or dunConfig.type == 24
|
|
-- or dunConfig.type == 16
|
|
-- or dunConfig.type == 15
|
|
-- or dunConfig.type == 25
|
|
-- or dunConfig.type == 0
|
|
-- or self:IsBossPersonScene()
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
function SceneManager:IsCoinDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.COIN
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
--新手降神副本
|
|
function SceneManager:IsNewbieGodDungeon(dun_id)
|
|
dun_id = dun_id or self:GetCurrDunId()
|
|
return dun_id == 5405
|
|
end
|
|
--新手副本
|
|
function SceneManager:IsNewbieDungeon(dun_id)
|
|
dun_id = dun_id or self:GetCurrDunId()
|
|
return dun_id == 1002
|
|
end
|
|
|
|
function SceneManager:IsGemDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.GEM
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
function SceneManager:IsRefineDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.REFINE
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
function SceneManager:IsStarDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.COIN
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
function SceneManager:IsGuildBossDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.GUILD_BOSS
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
function SceneManager:IsGuildGuardDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.GUARD
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
--死亡是否是幽灵模式的场景
|
|
function SceneManager:IsGhostModeScene(scene_id)
|
|
return false
|
|
end
|
|
|
|
--显示所有伤害飘字的场景
|
|
function SceneManager:ShowAllDamageScene()
|
|
return self:IsPkRankFightScene() or self:IsTopPkScene() or self:IsMirrorPkRankScene()
|
|
end
|
|
|
|
--是否在不能点击超链接寻路的场景
|
|
function SceneManager:IsClickFindScene(cur_scene_id, target_scene_id)
|
|
-- if cur_scene_id == target_scene_id then return true end
|
|
-- local cur_scene_info = self:GetSceneInfo(cur_scene_id)
|
|
-- local tar_scene_info = self:GetSceneInfo(target_scene_id)
|
|
-- if not cur_scene_info or not tar_scene_info then return false end
|
|
-- local function check(scene_type)
|
|
-- for i,v in ipairs(Config.LinkClickScene) do
|
|
-- if scene_type == 4 then --社团场景
|
|
-- return RoleManager:getInstance():GetMainRoleVo().guild_id > 0
|
|
-- elseif scene_type == v then
|
|
-- return true
|
|
-- end
|
|
-- end
|
|
-- return false
|
|
-- end
|
|
-- local cur_can_click = check(cur_scene_info.type)
|
|
-- local tar_can_click = check(tar_scene_info.type)
|
|
-- return cur_can_click and tar_can_click
|
|
end
|
|
|
|
--每个场景的复活类型
|
|
function SceneManager:GetReliveType(scene_id)
|
|
if self:IsDungeonScene(scene_id) then
|
|
return 9
|
|
elseif self:IsCSPvP(scene_id) then
|
|
return 10
|
|
else
|
|
return 1
|
|
end
|
|
end
|
|
|
|
function SceneManager:GetModuleId(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id
|
|
end
|
|
|
|
function SceneManager:IsPreChangeSceneState()
|
|
return self.pre_change_scene_state
|
|
end
|
|
|
|
--切换场景预读条
|
|
function SceneManager:ClearPreChangeSceneHandle()
|
|
if self.pre_change_scene_handle then
|
|
GlobalTimerQuest:CancelQuest(self.pre_change_scene_handle)
|
|
self.pre_change_scene_handle = nil
|
|
end
|
|
end
|
|
|
|
--切换场景预读条
|
|
function SceneManager:PreChangeScene( change_func)
|
|
|
|
self.pre_change_scene_state = true
|
|
Scene.Instance:GetMainRole():PreChangeScene()
|
|
|
|
local check_finish = function(state)
|
|
self.pre_change_scene_state = false
|
|
if change_func then
|
|
change_func( state )
|
|
change_func = nil
|
|
end
|
|
self.pre_change_scene_handle = nil
|
|
end
|
|
|
|
if self.pre_change_scene_handle then
|
|
GlobalTimerQuest:CancelQuest(self.pre_change_scene_handle)
|
|
self.pre_change_scene_handle = nil
|
|
end
|
|
|
|
local last_time = Config.ConfigDungeonClient.change_scene_transfer_time
|
|
self.pre_change_scene_handle = setTimeout(check_finish, last_time)
|
|
|
|
self:ShowPreChangeSceneView( check_finish, last_time)
|
|
end
|
|
|
|
function SceneManager:ShowPreChangeSceneView( callback,last_time )
|
|
|
|
local check_view = function()
|
|
if self.pre_change_scene then
|
|
self.pre_change_scene:Close()
|
|
self.pre_change_scene = nil
|
|
end
|
|
end
|
|
|
|
local finish_func = function( succeed )
|
|
check_view()
|
|
callback( not succeed )
|
|
end
|
|
|
|
check_view()
|
|
|
|
if self.pre_change_scene == nil then
|
|
self.pre_change_scene = PreChangeSceneView.New( finish_func, last_time )
|
|
end
|
|
|
|
self.pre_change_scene:Open()
|
|
end
|
|
|
|
--是否正在读条切换场景
|
|
function SceneManager:IsPreparingChangeScene()
|
|
return self.pre_change_scene
|
|
end
|
|
|
|
--判断两个角色是否友方
|
|
function SceneManager:IsFriendlyRole(vo1, vo2)
|
|
vo2 = vo2 or RoleManager.Instance.mainRoleInfo
|
|
local is_friendly = false
|
|
if vo1.role_id == vo2.role_id then
|
|
is_friendly = true
|
|
elseif vo1.warGroup == vo2.warGroup and vo1.warGroup > 0 then
|
|
is_friendly = true
|
|
elseif vo1.warGroup == vo2.warGroup and vo1.warGroup == 0 then
|
|
if vo1.team_id == vo2.team_id and vo1.team_id > 0 then
|
|
is_friendly = true
|
|
elseif vo1.guild_id == vo2.guild_id and vo1.guild_id > 0 then
|
|
is_friendly = true
|
|
end
|
|
end
|
|
return is_friendly
|
|
end
|
|
|
|
--attacker_vo是否能通过pkstatus的验证 攻击defender_vo
|
|
function SceneManager:CanPKByPKStatus(attacker_vo,defender_vo)
|
|
if attacker_vo and defender_vo then
|
|
if attacker_vo == defender_vo then
|
|
return false
|
|
end
|
|
|
|
-- if attacker_vo.hp == 0 or defender_vo.hp == 0 then
|
|
if defender_vo.hp == 0 then
|
|
return false
|
|
end
|
|
|
|
if defender_vo.boss_type then --怪物
|
|
if defender_vo.warGroup == attacker_vo.warGroup and attacker_vo.warGroup > 0 then
|
|
return false
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
|
|
if (attacker_vo.pk_status == RoleVo.PK_STATUS.ForcePeace) and
|
|
(defender_vo.vo_type == SceneBaseType.Role) then
|
|
--强制和平状态下不可以攻击人
|
|
return false
|
|
end
|
|
|
|
if attacker_vo.pk_status and ((attacker_vo.warGroup == 0 and defender_vo.warGroup == 0) or (attacker_vo.warGroup ~= defender_vo.warGroup)) then
|
|
if attacker_vo.pk_status == RoleVo.PK_STATUS.Peace then --和平模式:只会攻击怪物和红名状态下的非同队和同社团的玩家
|
|
if (attacker_vo.team_id == defender_vo.team_id and attacker_vo.team_id > 0)
|
|
or (attacker_vo.guild_id == defender_vo.guild_id and attacker_vo.guild_id > 0)
|
|
then
|
|
return false
|
|
elseif defender_vo.hatred and defender_vo.hatred > 0 then
|
|
return true
|
|
end
|
|
return false
|
|
elseif attacker_vo.pk_status == RoleVo.PK_STATUS.Force then --强制模式:不能攻击同队和同社团的玩家(红名也不可攻击),可以攻击其他玩家
|
|
if (attacker_vo.team_id == defender_vo.team_id and attacker_vo.team_id > 0)
|
|
or (attacker_vo.guild_id == defender_vo.guild_id and attacker_vo.guild_id > 0)
|
|
then
|
|
return false
|
|
end
|
|
elseif attacker_vo.pk_status == RoleVo.PK_STATUS.Local then
|
|
if attacker_vo.server_id ~= defender_vo.server_id then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
elseif attacker_vo.pk_status == RoleVo.PK_STATUS.All then
|
|
return true
|
|
elseif attacker_vo.pk_status == RoleVo.PK_STATUS.GUILD then
|
|
if attacker_vo.guild_id == defender_vo.guild_id and attacker_vo.guild_id > 0 then
|
|
return false
|
|
elseif attacker_vo.team_id == defender_vo.team_id and attacker_vo.team_id > 0 then
|
|
return false
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
--主角是否能被attack_vo攻击,战斗分组不同 and
|
|
--safe_area_state 1角色处于安全区域状态 2角色处于非安全区域状态 3角色切场景进入安全区域状态
|
|
--not_check_safe_area 不考虑安全区域
|
|
function SceneManager:IsMainRoleCanBeAttack(attacker_vo, not_check_safe_area)
|
|
local defender_vo = RoleManager.Instance.mainRoleInfo
|
|
if attacker_vo == nil or defender_vo == nil or attacker_vo.hp == 0 or defender_vo.hp == 0 then
|
|
return false
|
|
end
|
|
|
|
--是否要检测场景的安全区域
|
|
if not not_check_safe_area then
|
|
if self:IsSafeArea(nil, attacker_vo.pos_x, attacker_vo.pos_y) then
|
|
return false
|
|
elseif defender_vo.safe_area_state == 1 or defender_vo.safe_area_state == 3 or (defender_vo.safe_area_state ~= 2 and self:IsSafeArea(nil, defender_vo.pos_x, defender_vo.pos_y)) then
|
|
return false
|
|
end
|
|
end
|
|
|
|
if attacker_vo.vo_type == SceneBaseType.MainRole then
|
|
return false
|
|
end
|
|
|
|
local war_group1 = attacker_vo.warGroup
|
|
local war_group2 = defender_vo.warGroup
|
|
local same_group = war_group2 == war_group1 and war_group1 > 0
|
|
|
|
if attacker_vo.vo_type == SceneBaseType.Monster then
|
|
if attacker_vo.guild_id > 0 and attacker_vo.guild_id == defender_vo.guild_id then --defender_vo.type == 3
|
|
return false
|
|
elseif attacker_vo.guild_id > 0 and attacker_vo.guild_id ~= defender_vo.guild_id then
|
|
return true
|
|
elseif attacker_vo.guaji_flag == 1 or attacker_vo.can_attack == 0
|
|
or attacker_vo.type == MonsterType.COLLECT or attacker_vo.type == MonsterType.TASK_COLLECT
|
|
or attacker_vo.type == MonsterType.PICK or attacker_vo.type == MonsterType.UD_COLLECT then
|
|
return false
|
|
end
|
|
end
|
|
|
|
if attacker_vo.vo_type ~= SceneBaseType.Role then
|
|
return not same_group
|
|
end
|
|
|
|
-- if not self:IsPKScene() then
|
|
-- return false
|
|
-- end
|
|
|
|
local canpkByPkStatus = true
|
|
if war_group1 == 0 and war_group2 == 0 then
|
|
canpkByPkStatus = self:CanPKByPKStatus(attacker_vo, defender_vo)
|
|
end
|
|
|
|
return canpkByPkStatus and not same_group
|
|
end
|
|
|
|
--主角是否能攻击defender_vo
|
|
--safe_area_state 0未设置 1角色处于安全区域状态 2角色处于非安全区域状态
|
|
--check_safe_area 考虑安全区域
|
|
function SceneManager:IsCanAttackByMainRole(defender_vo, check_safe_area, not_check_hp)
|
|
local attacker_vo = RoleManager.Instance.mainRoleInfo
|
|
if not attacker_vo or not defender_vo or (not not_check_hp and attacker_vo.hp == 0) or defender_vo.hp == 0 then
|
|
return false
|
|
end
|
|
|
|
if check_safe_area then
|
|
if attacker_vo.safe_area_state == 1 or (attacker_vo.safe_area_state == 0 and self:IsSafePos(attacker_vo.pos_x, attacker_vo.pos_y)) then
|
|
return false
|
|
elseif defender_vo.safe_area_state == 1 or (defender_vo.safe_area_state == 0 and self:IsSafePos(defender_vo.pos_x, defender_vo.pos_y)) then
|
|
return false
|
|
end
|
|
end
|
|
|
|
local war_group1 = attacker_vo.warGroup
|
|
local war_group2 = defender_vo.warGroup
|
|
local same_group = war_group2 == war_group1 and war_group1 > 0
|
|
--同社团车队,非社团成员看见的血是红色
|
|
if defender_vo.vo_type == SceneBaseType.Monster then
|
|
if defender_vo.guild_id > 0 and defender_vo.guild_id == attacker_vo.guild_id then --defender_vo.type == 3
|
|
return false
|
|
elseif defender_vo.guild_id > 0 and defender_vo.guild_id ~= attacker_vo.guild_id then
|
|
return true
|
|
elseif defender_vo.guaji_flag == 1 or defender_vo.can_attack == 0
|
|
or defender_vo.type == MonsterType.COLLECT or defender_vo.type == MonsterType.TASK_COLLECT
|
|
or defender_vo.type == MonsterType.PICK or defender_vo.type == MonsterType.UD_COLLECT
|
|
or defender_vo.type == MonsterType.ESCORT then
|
|
return false
|
|
end
|
|
end
|
|
|
|
if defender_vo.vo_type == SceneBaseType.MainRole then
|
|
return false
|
|
end
|
|
if defender_vo.vo_type ~= SceneBaseType.Role then
|
|
return not same_group
|
|
end
|
|
|
|
-- if not self:IsPKScene() then
|
|
-- return false
|
|
-- end
|
|
|
|
local canpkByPkStatus = true
|
|
|
|
if war_group1 == 0 and war_group2 == 0 then
|
|
canpkByPkStatus = self:CanPKByPKStatus(attacker_vo, defender_vo)
|
|
end
|
|
return canpkByPkStatus and not same_group
|
|
end
|
|
|
|
--设置收到场景跳转协议时是否立即跳转
|
|
function SceneManager:DelayToChangeScene()
|
|
self.delay_change_scene = true
|
|
end
|
|
|
|
--获取是否需要延迟跳转
|
|
function SceneManager:CheckDirectly()
|
|
return not self.delay_change_scene
|
|
end
|
|
|
|
function SceneManager:CancelDelay()
|
|
self.delay_change_scene = nil
|
|
end
|
|
|
|
function SceneManager:CheckDisplayAddExpAvailable()
|
|
return true
|
|
end
|
|
|
|
--是否客户端隐身npc, 创建npc但不显示,用于触发任务
|
|
function SceneManager:IsClientHideNpc( npcid )
|
|
return npcid == 100499
|
|
end
|
|
|
|
-- --是否在社团篝火宴会场景
|
|
-- function SceneManager:IsGuildScene(scene_id)
|
|
-- if scene_id == nil and self.temp_check_list["IsGuildScene"] ~= nil then
|
|
-- return self.temp_check_list["IsGuildScene"]
|
|
-- end
|
|
-- local save = false
|
|
-- if scene_id == nil then
|
|
-- save = true
|
|
-- end
|
|
-- scene_id = scene_id or self:GetSceneId()
|
|
-- for k,v in pairs(Config.Gfeast) do
|
|
-- if Trim(v.key) == "scene_id" then
|
|
-- if save then
|
|
-- self.temp_check_list["IsGuildScene"] = scene_id == v.value
|
|
-- end
|
|
-- return scene_id == v.value
|
|
-- end
|
|
-- end
|
|
-- if save then
|
|
-- self.temp_check_list["IsGuildScene"] = false
|
|
-- end
|
|
-- return false
|
|
-- end
|
|
|
|
--是否在社团驻地场景
|
|
function SceneManager:IsGuildScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 4063 or scene_id == 4064
|
|
end
|
|
|
|
-- 是否是本国团战场景
|
|
function SceneManager:IsGuildCSGRScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 4200 -- 跨服模式场景
|
|
or scene_id == 4201 -- 本服模式场景
|
|
end
|
|
|
|
--新手虚构的赏金BOSS,实际是一个副本
|
|
function SceneManager:IsFakeBossMoneyScene(scene_id)
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == BossModel.FAKE_MONEY_BOSS_SCENE_ID
|
|
end
|
|
|
|
function SceneManager:IsBossMoneyScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
local scene_typt = self:GetSceneType(scene_id)
|
|
return scene_typt == 7 or self:IsFakeBossMoneyScene(scene_id)
|
|
end
|
|
|
|
function SceneManager:IsBossWorldScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
local scene_typt = self:GetSceneType(scene_id)
|
|
return scene_typt == 3
|
|
end
|
|
|
|
--是否在个人boss场景
|
|
function SceneManager:IsBossPersonScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
for k,v in pairs(Config.Dungeoncfg) do
|
|
if v.scene_id == scene_id then
|
|
return v.type == BaseDungeonModel.DUN_TYPE.PersonBoss
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--是否在个人boss场景
|
|
function SceneManager:IsBossPersonDun( dun_id )
|
|
dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
return dunConfig.type == BaseDungeonModel.DUN_TYPE.PersonBoss
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
--是否在幻魔星域场景
|
|
function SceneManager:IsBossDesertedScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
local scene_typt = self:GetSceneType(scene_id)
|
|
return scene_typt == SCENE_TYPE.DESERTED
|
|
end
|
|
|
|
--是否在boss场景
|
|
function SceneManager:IsBossScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return self:IsBossPersonScene(scene_id) or self:IsBossWorldScene(scene_id) or self:IsBossMoneyScene(scene_id) or self:IsBossDesertedScene() or self:IsBossHomeScene()
|
|
end
|
|
|
|
--是否在boss之家场景
|
|
function SceneManager:IsBossHomeScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
local scene_typt = self:GetSceneType(scene_id)
|
|
return scene_typt == SCENE_TYPE.BOSSHOME
|
|
end
|
|
|
|
--是否在副本, boss场景等不可跳转的地方
|
|
function SceneManager:IsOnDunOrBossScene( )
|
|
return self:IsDungeonScene() or self:IsTeamDungeonScene() or self:IsBossPersonScene()
|
|
end
|
|
|
|
--是否定点挂机场景
|
|
function SceneManager:IsFixedPointFightScene( )
|
|
return self:IsPetDungeon() or self:IsDunExpSeaScene()
|
|
end
|
|
|
|
--是否显示主界面boss列表
|
|
function SceneManager:IsShowMainUIMonsterView( )
|
|
return false
|
|
end
|
|
|
|
--显示怪物怒气的场景
|
|
function SceneManager:IsShowAngerScene( )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return false
|
|
end
|
|
|
|
--复活疲劳生效的场景
|
|
function SceneManager:IsReliveTiredScene( )
|
|
return false
|
|
end
|
|
|
|
--是否在幻兽之域场景(返回层数)
|
|
function SceneManager:IsWorldBeastScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return ((scene_id == 1501) and 1) or ((scene_id == 1502) and 2) or nil
|
|
end
|
|
|
|
--是否是跨服场景
|
|
function SceneManager:IsCrossScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return self:IsWorldBeastScene(scene_id)
|
|
end
|
|
|
|
--是否是神格副本
|
|
function SceneManager:IsContinueChangeGodScene()
|
|
return self:IsGodHoodDungeon() or self:GetSceneId() == 5405
|
|
end
|
|
|
|
--是否是将神塔副本
|
|
function SceneManager:IsGodHoodTowerDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.GODHOOD_TOWER
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
--是否是神格副本
|
|
function SceneManager:IsGodHoodDungeon(dun_id)
|
|
-- dun_id = dun_id or self:GetCurrDunId()
|
|
-- local dunConfig = Config.Dungeoncfg[dun_id]
|
|
-- if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.GODHOOD
|
|
-- else
|
|
-- return false
|
|
-- end
|
|
end
|
|
|
|
--是否在跳一跳场景
|
|
function SceneManager:IsJumpOneScene(scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 20010
|
|
end
|
|
|
|
--是否在单服社团战场景
|
|
function SceneManager:IsGuildWarScene(scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 4100
|
|
end
|
|
--跨服社团战场景(无尽海域)
|
|
function SceneManager:IsKFGuildWarFightScene(scene_id)
|
|
-- scene_id = scene_id or self:GetSceneId()
|
|
-- return scene_id and scene_id == KFGuildWarModel:getInstance():GetKFGuildWarConfig(4)
|
|
end
|
|
--是否是庭院场景
|
|
function SceneManager:IsHomeBuildScene( scene_id )
|
|
-- scene_id = scene_id or self:GetSceneId()
|
|
-- -- return scene_id == 11001
|
|
-- return scene_id and scene_id == HomeModel:getInstance():GetRoleHomeKVCfg(1)
|
|
end
|
|
--是否是房屋场景
|
|
function SceneManager:IsHomeRoomScene( scene_id )
|
|
-- if scene_id == nil and self.temp_check_list["IsHomeRoomScene"] ~= nil then
|
|
-- return self.temp_check_list["IsHomeRoomScene"]
|
|
-- end
|
|
-- local save = false
|
|
-- if scene_id == nil then
|
|
-- save = true
|
|
-- end
|
|
-- scene_id = scene_id or self:GetSceneId()
|
|
-- for i,v in pairs(Config.Rolehome) do
|
|
-- if scene_id == v.home_scene then
|
|
-- if save then
|
|
-- self.temp_check_list["IsHomeRoomScene"] = true
|
|
-- end
|
|
-- return true
|
|
-- end
|
|
-- end
|
|
-- if save then
|
|
-- self.temp_check_list["IsHomeRoomScene"] = false
|
|
-- end
|
|
-- return false
|
|
end
|
|
|
|
--是否在婚礼的场景
|
|
function SceneManager:IsWeddingScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
local target_scene_id = tonumber(Config.Marriageconstant[13].constant)
|
|
return scene_id == target_scene_id
|
|
end
|
|
|
|
--是否在大乱斗场景
|
|
function SceneManager:IsPkBattleScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 5801 or scene_id == 5802
|
|
end
|
|
|
|
--是否显示坐骑场景,默认大世界才显示,战场玩法中要下坐骑,个别需要显示坐骑的场景可以添加进去
|
|
function SceneManager:IsShowHorseScene()
|
|
local is_show_horse = false
|
|
if (self:IsMainCityorYieldScene() or self:IsBossDesertedScene() or self:IsBossHomeScene()) and
|
|
not self:IsUnderWaterScene() then
|
|
is_show_horse = true
|
|
end
|
|
return is_show_horse
|
|
end
|
|
|
|
--需要显示|屏蔽玩家宠物的场景
|
|
function SceneManager:showPetScene()
|
|
return not (self:IsNoonQuizScene() or self:IsBeachScene() or self:IsTopPkScene() or self:IsCSPvP() or self:IsOvnFightingScene()
|
|
or self:IsStarDungeonScene() or self:IsKFGuildWarFightScene() or self:IsBabyScene()) --or self:IsEscortScene()
|
|
end
|
|
|
|
--需要显示|屏蔽玩家宠物的场景
|
|
function SceneManager:showPokemonScene()
|
|
return not (self:IsDiamondFightScene() or self:IsPkRankFightScene() or self:IsJumpOneScene() or self:IsCSPvP() or self:IsOvnFightingScene() or self:IsStarDungeonScene() or self:IsStarFightScene() or self:IsSpiritWarScene()
|
|
or self:IsBeachScene() or self:IsKFGuildWarFightScene() or self:IsNoonQuizScene() or self:IsTopPkScene() or self:IsOvnWaitingScene() or self:IsBabyScene())
|
|
end
|
|
|
|
--需要显示|屏蔽玩家称号的场景
|
|
function SceneManager:showDsgtScene()
|
|
return not (--[[self:IsBossScene() or--]] self:IsWorldBeastScene() or self:IsStarDungeonScene() or self:IsGodDungeon() or self:IsRageWarScene())
|
|
end
|
|
|
|
--需要显示|屏蔽玩家宝宝的场景
|
|
function SceneManager:showBabyScene()
|
|
return not (self:IsDiamondFightScene() or self:IsBeachScene() or self:IsJumpOneScene() or self:IsNoonQuizScene() or self:IsCSPvP()
|
|
or self:IsOvnFightingScene() or self:IsStarDungeonScene() or self:IsKFGuildWarFightScene() or self:IsTopPkScene() or self:IsPkRankFightScene() or self:IsOvnWaitingScene() or self:IsBabyScene())--or self:IsEscortScene()
|
|
end
|
|
|
|
--需要显示|屏蔽玩家守护的场景
|
|
function SceneManager:showSpriteScene()
|
|
return not (self:IsBeachScene() or self:IsBabyScene() or self:IsJumpOneScene())
|
|
end
|
|
|
|
--需要显示|屏蔽玩家翅膀的场景
|
|
function SceneManager:showWingScene()
|
|
return not (self:IsNoonQuizScene() or self:IsStarDungeonScene() or self:IsJumpOneScene())
|
|
end
|
|
|
|
--需要显示|屏蔽玩家武器的场景[人物动作会根据这个改动]
|
|
function SceneManager:showWeaponScene()
|
|
return not (self:IsStarDungeonScene())-- or self:IsBeachScene())--暂时先屏蔽这个沙滩场景
|
|
end
|
|
|
|
function SceneManager:maskReliveViewScene()--不展示复活界面
|
|
if self:IsThreadDungeon() or self:IsNomalDungeon() then--主线副本和普通副本要判断复活次数
|
|
local dun_cfg = BaseDungeonModel:GetInstance():GetDunCfg(self:GetCurrDunId())
|
|
if dun_cfg and dun_cfg.revive_count == 0 then
|
|
return true
|
|
end
|
|
elseif self:IsPetDungeon() then--宠物副本判断复活次数
|
|
local left_pet_dun_relive_times = BaseDungeonModel:GetInstance():GetDunPetReliveTimes()
|
|
if left_pet_dun_relive_times <= 0 then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
else
|
|
return self:IsExpDun() or self:IsOneTowerDungeon() or self:IsIllusoryLightDun() or self:IsGodDungeon() or self:IsGalaxyDun() or self:IsNomalDungeon() or self:IsSandTableDungeon()
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- 是否智慧达人(中午答题)场景
|
|
function SceneManager:IsNoonQuizScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 5171
|
|
end
|
|
|
|
function SceneManager:IsShowCollectBtnScene()
|
|
return (self:IsPkBattleScene() or self:IsGuildWarScene() or self:IsCSPvP() or self:IsWeddingScene() or self:IsLeagueWarScene())
|
|
end
|
|
|
|
-- 是否为强制隐藏挂机按钮场景
|
|
function SceneManager:IsHideAutoBtnScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return self:IsNoonQuizScene()
|
|
end
|
|
|
|
-- 是否为强制隐藏跳跃按钮场景
|
|
function SceneManager:IsHideJumpBtnScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return self:IsStarDungeonScene()
|
|
end
|
|
|
|
function SceneManager:IsDelayAutoFightScene(scene_id)
|
|
return self:IsPkBattleScene()
|
|
end
|
|
|
|
function SceneManager:CanAutoFightScene(scene_id)
|
|
return not self:IsCSPvP()
|
|
end
|
|
|
|
--是否是情缘副本
|
|
function SceneManager:IsLoveDungeon(dun_id)
|
|
dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.LOVE
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function SceneManager:IsEudemonsAttackFightScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 4401
|
|
end
|
|
|
|
--是否是勇者副本
|
|
function SceneManager:IsYongZheDungeon(dun_id)
|
|
dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.YONGZHE
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
--是否在捕蝶场景
|
|
function SceneManager:IsOnButterflyScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
|
|
return scene_id == 3010
|
|
end
|
|
|
|
--设置是否在采集
|
|
function SceneManager:SetCollectFlag( is_collect )
|
|
self.is_collect = is_collect
|
|
end
|
|
|
|
--设置是否在采集
|
|
function SceneManager:GetCollectFlag( )
|
|
return self.is_collect
|
|
end
|
|
|
|
--是否护送场景
|
|
function SceneManager:IsEscortScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
local scene_data = stringtotable(Config.Convoykv["convoy_pk_scene"].value_content)
|
|
return scene_id == scene_data[1] or scene_id == scene_data[2]
|
|
end
|
|
|
|
function SceneManager:IsEscortAllScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
local scene_data1 = stringtotable(Config.Convoykv["convoy_pk_scene"].value_content)
|
|
local scene_data2 = stringtotable(Config.Convoykv["convoy_safe_scene"].value_content)
|
|
return scene_id == scene_data1[1] or scene_id == scene_data1[2] or scene_id == scene_data2[1] or scene_id == scene_data2[2]
|
|
end
|
|
--已经没有这个副本了
|
|
function SceneManager:IsEscortPVEDunScene( dun_id )
|
|
return false
|
|
end
|
|
|
|
--是否展示主界面出口按钮
|
|
function SceneManager:IsShowMainExitScene( )
|
|
return SceneManager:getInstance():IsWorldBeastScene() or self:IsIntrusionWorldHoneScene()
|
|
end
|
|
|
|
--显示结婚预告图标的场景
|
|
function SceneManager:IsShowMarriageScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.type == 0 or sceneInfo.type == 1))
|
|
end
|
|
|
|
--不显示危险警告特效场景
|
|
function SceneManager:IsShowDangerWarnScene(scene_id)
|
|
return not self:IsStarFightScene() and not self:IsStarDungeonScene()
|
|
end
|
|
|
|
--是否限制其他玩家外观的场景(目前只在创建这些对象的时候生效:AI娘,宝具,宠物,宝宝)
|
|
function SceneManager:IsModelLimited( )
|
|
local is_limited = false
|
|
--大世界不屏蔽
|
|
local scene_id = self:GetSceneId()
|
|
if self:IsMainCityAndFieldScene(scene_id) then
|
|
return false
|
|
end
|
|
--多人战场玩法需要屏蔽
|
|
if self:IsBossScene() --BOSS
|
|
or self:IsRageWarScene() --狂战
|
|
or self:IsWastelandScene() --废土
|
|
or self:IsEndlessScene() --无尽
|
|
or self:IsGuildWarScene() --本服团战
|
|
or self:IsGuildCSGRScene() --跨国团战
|
|
then
|
|
is_limited = true
|
|
end
|
|
return is_limited
|
|
end
|
|
|
|
--是否特效全开的场景
|
|
function SceneManager:IsFullEffectScene( scene_id )
|
|
-- if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
|
|
-- return false
|
|
-- end
|
|
if self:IsMirrorPkRankScene(scene_id) or self:IsCrusadeScene(scene_id) then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
--是否显示所有小怪血条的副本,压力本中需要(经验副本、爬塔副本、幻光副本、宠物副本)
|
|
function SceneManager:IsShowMonsterBloodDun( dun_id )
|
|
return self:IsExpDun(dun_id)
|
|
or self:IsOneTowerDungeon(dun_id)
|
|
or self:IsIllusoryLightDun(dun_id)
|
|
or self:IsPetDungeon(dun_id)
|
|
end
|
|
|
|
function SceneManager:CheckSceneFightSoundAvaliable(scene_id)
|
|
return self:IsStarFightScene() or self:IsSpiritWarScene()
|
|
end
|
|
|
|
function SceneManager:IsShowLiveEffectScene(scene_id)
|
|
return not self:IsBeachScene() and not self:IsStarDungeonScene()
|
|
end
|
|
|
|
--隐藏其他人小头像的场景
|
|
function SceneManager:HideOtherHeadScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return false
|
|
end
|
|
|
|
--是否需要预加载将神资源的副本
|
|
function SceneManager:IsNeedPreloadGodResScene( )
|
|
-- local sceneInfo = self:GetSceneInfo(scene_id)
|
|
-- if sceneInfo and (sceneInfo.type == 3 or sceneInfo.type == 5 or sceneInfo.type == 7 or sceneInfo.type == 8 or
|
|
-- sceneInfo.type == 9 or sceneInfo.type == 11 or sceneInfo.type == 12 or sceneInfo.type == 13 or
|
|
-- sceneInfo.type == 14 or sceneInfo.type == 15 or sceneInfo.type == 16 or sceneInfo.type == 19) then
|
|
-- return true
|
|
-- elseif sceneInfo and sceneInfo.type == 2 then
|
|
-- return not self:IsStarDungeon() and not self:IsStarFightScene() and not self:IsPkRankFightScene()
|
|
-- end
|
|
return true
|
|
end
|
|
|
|
--显示墓碑的场景
|
|
function SceneManager:IsShowGraveScene()
|
|
return self:IsBossDesertedScene() or self:IsBossHomeScene()
|
|
end
|
|
|
|
function SceneManager:AddGraveVo(grave_vo)
|
|
self.grave_vo_list[grave_vo.instance_id] = grave_vo
|
|
GlobalEventSystem:Fire(SceneEventType.GRAVE_VO_ADD, grave_vo.instance_id, grave_vo)
|
|
end
|
|
|
|
function SceneManager:GetGraveVo(ins_id)
|
|
return self.grave_vo_list[ins_id]
|
|
end
|
|
|
|
function SceneManager:DeleteGraveVo(ins_id)
|
|
local vo = self:GetGraveVo(ins_id)
|
|
if vo then
|
|
self.grave_vo_list[ins_id] = nil
|
|
GlobalEventSystem:Fire(SceneEventType.GRAVE_VO_REMOVE, ins_id, vo)
|
|
return vo
|
|
end
|
|
end
|
|
|
|
function SceneManager:ClearAllGraveVo()
|
|
if not (self:IsShowGraveScene() or self:IsWorldBeastScene()) then
|
|
for k, vo in pairs(self.grave_vo_list) do
|
|
GlobalEventSystem:Fire(SceneEventType.GRAVE_VO_REMOVE, vo.instance_id, vo)
|
|
end
|
|
self.grave_vo_list = {}
|
|
end
|
|
end
|
|
|
|
--主城和野外场景
|
|
function SceneManager:IsMainCityAndFieldScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and (sceneInfo.type == 0 or sceneInfo.type == 1))
|
|
end
|
|
|
|
--是否全场景,1为全场景 0为九宫格
|
|
function SceneManager:IsBroadCastScene(scene_id)
|
|
local sceneInfo = self:GetSceneInfo(scene_id)
|
|
return (sceneInfo and sceneInfo.broadcast and sceneInfo.broadcast == 1)
|
|
end
|
|
|
|
--是否屏蔽传闻和公告的场景
|
|
function SceneManager:IsNoHornAndNoticeScene(scene_id)
|
|
return self:IsNoonQuizScene()
|
|
end
|
|
|
|
|
|
function SceneManager:IsSwingScene(scene_id)
|
|
return self:IsBeachScene() or self:IsKFGuildWarFightScene()
|
|
end
|
|
|
|
--boss特殊选中光环
|
|
function SceneManager:ShowSpecialLightScene( scene_id )
|
|
return self:IsBossScene(scene_id) or self:IsWorldBeastScene(scene_id)
|
|
end
|
|
|
|
--觉醒之门场景
|
|
function SceneManager:IsAwakeScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 2401
|
|
end
|
|
|
|
--新手引导经验副本
|
|
function SceneManager:IsGuideExpDungeon(dun_id)
|
|
local dun_id = dun_id or self:GetCurrDunId()
|
|
return dun_id == 3002
|
|
end
|
|
|
|
--觉醒之门
|
|
function SceneManager:IsAwakeDungeon(dun_id)
|
|
dun_id = dun_id or self:GetCurrDunId()
|
|
local dunConfig = Config.Dungeoncfg[dun_id]
|
|
if dunConfig then
|
|
-- return dunConfig.type == BaseDungeonModel.DUN_TYPE.AWAKE
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- 荣耀战神
|
|
function SceneManager:IsHonourFightScene(scene_id)
|
|
-- scene_id = scene_id or self:GetSceneId()
|
|
-- local bf_k = 4
|
|
-- local kf_k = 5
|
|
-- if Config.Wargodkv[bf_k].val == scene_id or Config.Wargodkv[kf_k].val == scene_id then
|
|
-- return true
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
function SceneManager:IsLeagueWarScene(scene_id)
|
|
local bool = false
|
|
-- scene_id = scene_id or self:GetSceneId()
|
|
-- if scene_id == Config.Leaguewarconstcfg[6].value or scene_id == Config.Leaguewarconstcfg[11].value then
|
|
-- bool = true
|
|
-- end
|
|
|
|
return bool
|
|
end
|
|
|
|
-- function SceneManager:NeedEnterSceneAction(force_show_action)
|
|
-- if not force_show_action and RoleManager.Instance.mainRoleInfo.level < 150 then
|
|
-- return false
|
|
-- end
|
|
|
|
-- local scene_id = SceneController.Instance.request_scene_id
|
|
-- if scene_id then
|
|
-- local config_data = Config.ConfigChangeSceneEffect.data[scene_id]
|
|
-- if not config_data then
|
|
-- return Config.ConfigChangeSceneEffect.default_action
|
|
-- end
|
|
-- return config_data.pre_action
|
|
-- end
|
|
-- return false
|
|
-- end
|
|
|
|
function SceneManager:IsEnterSameScene()
|
|
do return false end
|
|
-- local scene_id = SceneController.Instance.request_scene_id
|
|
-- if scene_id then
|
|
-- local config_data = Config.ConfigChangeSceneEffect.data[scene_id]
|
|
-- if config_data and config_data.load_type == 3 then
|
|
-- return true
|
|
-- end
|
|
-- end
|
|
-- return Config.ConfigChangeSceneEffect.default_load == 3
|
|
end
|
|
|
|
function SceneManager:NeedEnterSceneEffect()
|
|
-- local config_data = Config.ConfigChangeSceneEffect.data[self.curr_scene_id]
|
|
-- if not config_data then
|
|
-- return Config.ConfigChangeSceneEffect.default_effect
|
|
-- end
|
|
|
|
-- if config_data.enter_effect then
|
|
-- return true
|
|
-- end
|
|
return false
|
|
end
|
|
|
|
function SceneManager:SetCacheMainRolePos( )
|
|
local main_role = Scene.Instance:GetMainRole()
|
|
if main_role then
|
|
self.cache_main_role_pos_x = main_role.real_pos.x
|
|
self.cache_main_role_pos_y = main_role.real_pos.y
|
|
self.cache_main_role_birth_angle = main_role:GetDirectionAngle()
|
|
end
|
|
end
|
|
|
|
function SceneManager:ResetCacheMainRolePos( )
|
|
self.cache_main_role_pos_x = 0
|
|
self.cache_main_role_pos_y = 0
|
|
self.cache_main_role_birth_angle = nil
|
|
end
|
|
|
|
function SceneManager:GetCacheMainRolePos( )
|
|
if self.cache_main_role_pos_x then
|
|
self.cache_main_role_pos_x = self.cache_main_role_pos_x + 1
|
|
end
|
|
return self.cache_main_role_pos_x, self.cache_main_role_pos_y, self.cache_main_role_birth_angle
|
|
end
|
|
|
|
--不需要加载场景进度条
|
|
function SceneManager:NoLoadingViewScene(next_scene_id)
|
|
if not next_scene_id then
|
|
return self.is_no_loading_scene
|
|
end
|
|
local cur_scene_id = self:GetSceneId()
|
|
local next_scene_id = next_scene_id
|
|
|
|
self.is_no_loading_scene = false
|
|
local temp_cfg = Config.ConfigChangeSceneEffect.data[cur_scene_id]
|
|
if temp_cfg then
|
|
for k,v in pairs(temp_cfg) do
|
|
if v == next_scene_id then
|
|
self.is_no_loading_scene = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
return self.is_no_loading_scene
|
|
|
|
-- local bool = self:IsSpecialSceneLoadEffect(dungeon_id)--有些副本场景切换动画要特殊处理
|
|
-- if bool == false then
|
|
-- return false
|
|
-- end
|
|
|
|
-- if BaseDungeonModel:getInstance().exit_by_hand2 then--副本退出的时候也不要无缝切换
|
|
-- BaseDungeonModel:getInstance().exit_by_hand2 = false
|
|
-- self.is_no_loading_scene = false
|
|
-- return false
|
|
-- end
|
|
-- if scene_id then
|
|
-- if Scene.Instance.is_first_enter_scene then
|
|
-- self.is_no_loading_scene = false
|
|
-- Scene.Instance.is_first_enter_scene = false
|
|
-- return false
|
|
-- end
|
|
|
|
-- local default_loadtype = Config.ConfigChangeSceneEffect.default_load
|
|
-- local config_data = Config.ConfigChangeSceneEffect.data[scene_id]
|
|
|
|
-- local no_loading_state = false
|
|
-- if default_loadtype ~= 1 then
|
|
-- no_loading_state = true
|
|
-- end
|
|
|
|
-- if config_data then
|
|
-- if config_data.load_type == 1 then
|
|
-- no_loading_state = false
|
|
-- else
|
|
-- no_loading_state = true
|
|
-- end
|
|
-- end
|
|
|
|
-- if not no_loading_state then
|
|
-- config_data = Config.ConfigChangeSceneEffect.data[self:GetSceneId()]
|
|
-- if config_data and config_data.load_type ~= 1 then
|
|
-- no_loading_state = true
|
|
-- end
|
|
-- end
|
|
-- self.is_no_loading_scene = no_loading_state
|
|
-- else
|
|
-- if Scene.Instance.is_first_enter_scene then
|
|
-- return false
|
|
-- end
|
|
-- end
|
|
-- return self.is_no_loading_scene
|
|
end
|
|
|
|
--是否在无尽领域
|
|
function SceneManager:IsEndlessScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return ((scene_id >= 7100 and scene_id <= 7108) or (scene_id >= 7110 and scene_id <= 7118))
|
|
end
|
|
--是否在无尽领域跨服场景
|
|
function SceneManager:IsCSEndlessScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return (scene_id >= 7110 and scene_id <= 7118)
|
|
end
|
|
--是否在无尽领域顶层
|
|
function SceneManager:IsEndlessLastScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return (scene_id == EndlessConst.CSENDLESS_NINE_FLOOR_ID or scene_id == EndlessConst.ENDLESS_NINE_FLOOR_ID)
|
|
end
|
|
|
|
--是否显示伤害第一标识
|
|
function SceneManager:IsShowAttFirstScene( scene_id )
|
|
return self:IsBossWorldScene(scene_id) or self:IsBossMoneyScene(scene_id) or self:IsBossDesertedScene() or self:IsBossHomeScene()
|
|
end
|
|
|
|
--是否显示boss疲劳
|
|
function SceneManager:IsShowBossTireScene( scene_id )
|
|
return self:IsBossWorldScene(scene_id) or self:IsBossMoneyScene(scene_id)
|
|
end
|
|
|
|
--是否显示协助者标识
|
|
function SceneManager:IsShowHelperScene( scene_id )
|
|
return self:IsBossMoneyScene(scene_id) or self:IsGuildScene(scene_id) or self:IsBossDesertedScene()
|
|
end
|
|
|
|
--是否显示受击tip
|
|
function SceneManager:IsShowBeenAttackTips( scene_id )
|
|
return self:IsBossMoneyScene(scene_id) or self:IsMainCityAndFieldScene() or self:IsBossDesertedScene() or self:IsBossHomeScene()
|
|
end
|
|
|
|
function SceneManager:IsHideMainVipIcon( )
|
|
return self:IsDungeonScene() or self:IsBossWorldScene(scene_id)
|
|
or self:IsBossMoneyScene(scene_id) or self:IsGuildScene() or self:IsEscortScene()
|
|
or self:IsRageWarScene() or self:IsBossDesertedScene() or self:IsGuildCSGRScene() or self:IsGuildWarScene() or self:IsBossHomeScene()
|
|
end
|
|
|
|
--是否跨服世界场景(是否需要显示跨服世界分区预告的场景)
|
|
function SceneManager:IsKfWordScene( scene_id )
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 1016 --跨服主城
|
|
or scene_id == 1017 --跨服护送
|
|
end
|
|
|
|
--是否多人战斗场景(是的话会调高同场景人数)
|
|
function SceneManager:IsMultiPlayerBattleScene( )
|
|
return self:IsGuildWarScene() or self:IsCSGWarScene()
|
|
end
|
|
|
|
--是否是跨国团战场景
|
|
function SceneManager:IsCSGWarScene( scene_id )
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return Config.Crossguildwarconfig[11].value == scene_id
|
|
end
|
|
|
|
-- 是否是狂战领域活动场景
|
|
function SceneManager:IsRageWarScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 7800 -- 本服阶段
|
|
or scene_id == 7810 -- 开服未开启跨服的本服第二阶段
|
|
or scene_id == 7820 -- 跨服阶段
|
|
end
|
|
-- 是否是狂战领域第二阶段场景
|
|
function SceneManager:IsRageWarRound2Scene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 7810 -- 开服未开启跨服的本服第二阶段
|
|
or scene_id == 7820 -- 跨服阶段
|
|
end
|
|
function SceneManager:IsRageWarCrossServerScene(scene_id)
|
|
scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 7820
|
|
end
|
|
|
|
--是否是特殊场景加载场景切换特效
|
|
function SceneManager:IsSpecialSceneLoadEffect( dungeon_id )
|
|
if self:IsOneTowerDungeon(dungeon_id) then --爬塔副本,在第一次进去的时候,不要无缝切换,第二次开始才无缝切换
|
|
if not self.is_first_enter_tower_dun then
|
|
self.is_first_enter_tower_dun = true
|
|
return false
|
|
end
|
|
else
|
|
self.is_first_enter_tower_dun = false
|
|
end
|
|
end
|
|
--是否在废土战场
|
|
function SceneManager:IsWastelandScene(scene_id)
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
return ((scene_id >= 7600 and scene_id <= 7621) or scene_id == 7630 or scene_id == 7631)
|
|
end
|
|
--是否在废土战场跨服场景
|
|
function SceneManager:IsCSWastelandScene( scene_id )
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
return (scene_id == 7601 or scene_id == 7611 or scene_id == 7621 or scene_id == 7631)
|
|
end
|
|
--废土准备场景
|
|
function SceneManager:IsWastelandPrepareScene( )
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 7630 or scene_id == 7631
|
|
end
|
|
|
|
--是否展示左侧的动态轮播信息场景
|
|
function SceneManager:IsShowDynamicInfoScene(scene_id)
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
if self:IsWastelandPrepareScene(scene_id) -- 废土准备场景
|
|
or self:IsGuildScene(scene_id) -- 社团驻地场景
|
|
or BeachModel:GetInstance():IsShowDynamicInfo(scene_id) -- 温泉场景
|
|
or self:IsGuildWarScene(scene_id) --本服团战
|
|
or self:IsEndlessScene(scene_id)--无尽领域
|
|
or self:IsGuildCSGRScene(scene_id) -- 本国团战
|
|
then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
--得到道具假掉落位置单位是80(掉落的数量)
|
|
function SceneManager:GetGoodsFakerDropPosList( goods_len, per_interval )
|
|
if not goods_len or goods_len == 0 then return end
|
|
local per_interval = per_interval or 80
|
|
local pos_list = {}
|
|
local dot_list = nil
|
|
for k,v in ipairs(self.drop_pos_cfg) do
|
|
if k <= goods_len then
|
|
pos_list[#pos_list + 1] = {pos_x = per_interval*v[1],pos_y = per_interval*v[2]}
|
|
else
|
|
break
|
|
end
|
|
end
|
|
return pos_list
|
|
end
|
|
|
|
--初始化掉落随机位置列表
|
|
function SceneManager:InitDropPosCfg( )
|
|
self.drop_pos_cfg = {}
|
|
local cfg = DeepCopy(Config.Dropdotrule)
|
|
for k,v in ipairs(cfg) do
|
|
local dot_list = stringtotable(v.dot_list)
|
|
for ii,vv in ipairs(dot_list) do
|
|
self.drop_pos_cfg[#self.drop_pos_cfg + 1] = vv
|
|
end
|
|
end
|
|
end
|
|
|
|
--设置当前攻击主角的目标数据(右下角头像显示)
|
|
function SceneManager:SetAttackHeadVo( vo, role_id, force )
|
|
--手动点击角色,要覆盖目标
|
|
if force then
|
|
self.target_head_vo = vo
|
|
GlobalEventSystem:Fire(EventName.SHOW_OTHER_HEAD, true, vo, 2)
|
|
return
|
|
end
|
|
|
|
--战斗那边不知道vo,只有role_id,需要去场景上拿
|
|
if not self.target_head_vo then
|
|
if role_id then
|
|
vo = self:GetRoleVo(role_id)
|
|
end
|
|
self.target_head_vo = vo
|
|
if vo then
|
|
GlobalEventSystem:Fire(EventName.SHOW_OTHER_HEAD, true, vo, 2)
|
|
end
|
|
end
|
|
end
|
|
|
|
function SceneManager:ResetAttackHeadVo(hide_head)
|
|
if hide_head then
|
|
if self.target_head_vo then
|
|
GlobalEventSystem:Fire(EventName.SHOW_OTHER_HEAD, false)
|
|
end
|
|
end
|
|
self.target_head_vo = false
|
|
end
|
|
|
|
function SceneManager:GetAttackHeadVo( )
|
|
return self.target_head_vo
|
|
end
|
|
|
|
function SceneManager:GetScenObjDepth(y)
|
|
return SceneDepth.Obj + y * 0.5
|
|
end
|
|
|
|
function SceneManager:GetCameraRotateConfig( )
|
|
-- if not self:IsMainCityAndFieldScene() then
|
|
-- return
|
|
-- end
|
|
local scene_id = self:GetSceneId()
|
|
local temp_cfg = self.camera_rotate_cfg[scene_id]
|
|
if temp_cfg then
|
|
return temp_cfg
|
|
end
|
|
|
|
temp_cfg = Config.ConfigSceneCamera[scene_id] or Config.ConfigSceneCamera["default"]
|
|
if temp_cfg and temp_cfg.area_list then
|
|
self.camera_rotate_cfg[scene_id] = temp_cfg
|
|
return temp_cfg
|
|
end
|
|
end
|
|
|
|
function SceneManager:GetCameraRotateAngle( angle )
|
|
local cfg = self:GetCameraRotateConfig()
|
|
if not cfg then
|
|
return
|
|
end
|
|
local area_list = cfg.area_list or {}
|
|
local area_index, camera_angle
|
|
for k,v in pairs(area_list) do
|
|
local is_turn_around = false
|
|
if v[1] > v[2] then
|
|
is_turn_around = true
|
|
end
|
|
if is_turn_around and (angle > v[1] or angle <= v[2]) then
|
|
area_index = k
|
|
camera_angle = v[3]
|
|
break
|
|
elseif angle > v[1] and angle <= v[2] then
|
|
area_index = k
|
|
camera_angle = v[3]
|
|
break
|
|
end
|
|
end
|
|
if area_index and camera_angle then
|
|
return area_index, camera_angle
|
|
end
|
|
end
|
|
|
|
function SceneManager:IsDesertedBossCrossScene( scene_id )
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
return BossModel:GetInstance():CheckIsCrossDesertedScene(scene_id)
|
|
end
|
|
|
|
function SceneManager:IsUnderWaterScene( scene_id )
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == 1005 or scene_id == 2209 or scene_id == 2210 or scene_id == 10051
|
|
end
|
|
|
|
function SceneManager:IsMappingToSameScene( cur_id, tar_id )
|
|
self.scene_mapping_cfg = self.scene_mapping_cfg or {
|
|
[1003] = 1,
|
|
[1016] = 1,
|
|
[4063] = 2,
|
|
[4064] = 2,
|
|
}
|
|
|
|
if self.scene_mapping_cfg[cur_id] and self.scene_mapping_cfg[cur_id] == self.scene_mapping_cfg[tar_id] then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function SceneManager:CheckMatchLoadingRes( )
|
|
local res_list = {}
|
|
local role_lev = RoleManager.Instance.mainRoleInfo.level
|
|
if role_lev == 0 then
|
|
role_lev = LoginModel:getInstance():GetSelectRoleLevel() or 0
|
|
end
|
|
local open_serevr_time = ServerTimeModel:getInstance():GetOpenServerDay()
|
|
local cur_server_time = TimeUtil:getServerTime()
|
|
local create_role_time = ServerTimeModel:getInstance():GetCreateRoleDay()
|
|
local level_match, server_match, time_match, create_match,week_match --匹配标示
|
|
local level_item, server_item, create_item,week_item
|
|
local max_ran = 0
|
|
for k,v in pairs(Config.Sceneload) do
|
|
level_match, server_match, time_match, create_match, week_match = true, true, true, true,true
|
|
if v.lv then
|
|
level_item = stringtotable(v.lv)
|
|
if not IsTableEmpty(level_item) and (role_lev < level_item[1] or role_lev > level_item[2]) then
|
|
if (role_lev < level_item[1] or level_item[2] ~= 0 ) then
|
|
level_match = false
|
|
end
|
|
end
|
|
end
|
|
if v.server_open then
|
|
server_item = stringtotable(v.server_open)
|
|
if not IsTableEmpty(server_item) and (open_serevr_time < server_item[1] or open_serevr_time > server_item[2]) then
|
|
if (open_serevr_time < server_item[1] or server_item[2] ~= 0 ) then
|
|
server_match = false
|
|
end
|
|
end
|
|
end
|
|
if v.start_time and tonumber(v.start_time) > 0 and v.end_time and tonumber(v.end_time) > 0 then
|
|
if cur_server_time < tonumber(v.start_time) or cur_server_time > tonumber(v.end_time)then
|
|
time_match = false
|
|
end
|
|
end
|
|
if v.create_day then
|
|
if v.create_day then
|
|
create_item = stringtotable(v.create_day)
|
|
if not IsTableEmpty(create_item) and (create_role_time < create_item[1] or create_role_time > create_item[2]) then
|
|
if (create_role_time < create_item[1] or create_item[2] ~= 0 ) then
|
|
create_match = false
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
if v.week then
|
|
create_week = stringtotable(v.week)
|
|
local cur_date = os.date("*t", cur_server_time)
|
|
local cur_week_day = cur_date and cur_date.wday
|
|
cur_week_day = cur_week_day - 1 == 0 and 7 or cur_week_day - 1 --os.date周日是1,但是配置1是周一
|
|
if cur_week_day and not IsTableEmpty(create_week) then
|
|
week_match = false
|
|
for k,v in pairs(create_week) do
|
|
if tonumber(v) == tonumber(cur_week_day) then
|
|
week_match = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
--全部条件满足的才放到列表里
|
|
if level_match and server_match and time_match and create_match and week_match and v.weight then
|
|
max_ran = max_ran + v.weight
|
|
table.insert(res_list, v.id)
|
|
end
|
|
end
|
|
|
|
--按权重随机
|
|
local cur_res_id = 1
|
|
if #res_list >= 1 then
|
|
math.randomseed(os.clock() * 100000000)
|
|
local random_index = math.random(1, max_ran)
|
|
local temp_cfg
|
|
local cur_weight = 0
|
|
for i=1, #res_list do
|
|
temp_cfg = Config.Sceneload[res_list[i]]
|
|
if temp_cfg and temp_cfg.weight then
|
|
cur_weight = cur_weight + temp_cfg.weight
|
|
if cur_weight >= random_index then
|
|
cur_res_id = temp_cfg.res_id
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return cur_res_id
|
|
end
|
|
|
|
function SceneManager:IsDunExpSeaScene( scene_id )
|
|
local scene_id = scene_id or self:GetSceneId()
|
|
return scene_id == Config.Expseafloor[1].scene
|
|
end
|