MapProxy.lua 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. local RemoteProxy = requireProxy("remote/RemoteProxy")
  2. local MapProxy = class("MapProxy", RemoteProxy)
  3. MapProxy.NAME = global.ProxyTable.Map
  4. local ssplit = string.split
  5. local Forbids = {
  6. GUILD = false, -- 禁止显示行会名
  7. JOBLV = false, -- 禁止显示等级和职业
  8. SAY = false, -- 禁止说话
  9. CHECK = false, -- 禁止查看
  10. HPPER = false, -- 血量显示百分比
  11. NAME = false, -- 统一名字
  12. }
  13. local function get_bit(num, pos)
  14. if pos > 0 then
  15. pos = 32 - pos
  16. end
  17. return bit.band(bit.rshift(num, pos), 0x1)
  18. end
  19. -- 点到线段的距离
  20. local function getDistancePointToLine(lineA, lineB, point)
  21. local Ap = cc.p(0, 0)
  22. local Ab = cc.p(0, 0)
  23. local Bp = cc.p(0, 0)
  24. Ap.x = point.x - lineA.x
  25. Ap.y = point.y - lineA.y
  26. Ab.x = lineB.x - lineA.x
  27. Ab.y = lineB.y - lineA.y
  28. Bp.x = point.x - lineB.x
  29. Bp.y = point.y - lineB.y
  30. local r = (Ap.x * Ab.x + Ap.y * Ab.y) / (Ab.x * Ab.x + Ab.y * Ab.y)
  31. if r <= 0 then
  32. return math.floor(math.sqrt(Ap.x * Ap.x + Ap.y * Ap.y))
  33. end
  34. if r >= 1 then
  35. return math.floor(math.sqrt(Bp.x * Bp.x + Bp.y * Bp.y))
  36. end
  37. local px = lineA.x + Ab.x * r
  38. local py = lineA.y + Ab.y * r
  39. return math.floor(math.sqrt((point.x - px) * (point.x - px) + (point.y - py) * (point.y - py)))
  40. end
  41. function MapProxy:ctor()
  42. MapProxy.super.ctor(self)
  43. self._lastMapID = nil
  44. self._property = {}
  45. self._inSafeArea = false
  46. self._shakeGlobalHandle = nil -- 屏幕震动的全局延时回调
  47. self._openDoorAble = true -- 是否允许请求开门
  48. self._safeAreaID = nil -- 安全区id 脚本进出安全区操作
  49. self._mainPlaySafeAreaOwn = false -- 主玩家是否远离安全区
  50. self._shabakeOpen = false -- 沙巴克开启状态
  51. self._isCheckShaBaKeZone = false -- 是否检测沙巴克区域
  52. self._shabakeZone = {} -- 沙巴克区域
  53. end
  54. function MapProxy:GetMapID()
  55. return self._property.MapId
  56. end
  57. function MapProxy:GetMapName()
  58. return self._property.MapName
  59. end
  60. function MapProxy:GetLastMapID()
  61. return self._lastMapID
  62. end
  63. function MapProxy:GetMiniMapID()
  64. return self._property.Minimap
  65. end
  66. function MapProxy:SetShaBaKeOpen(state)
  67. self._shabakeOpen = state
  68. end
  69. function MapProxy:IsShaBaKeOpen()
  70. return self._shabakeOpen == true
  71. end
  72. function MapProxy:IsCheckShaBaKeZone()
  73. return self._isCheckShaBaKeZone
  74. end
  75. function MapProxy:GetMiniMapFile()
  76. local miniMapID = self:GetMiniMapID()
  77. if not miniMapID or miniMapID == 0 then
  78. if SL:GetMetaValue("GAME_DATA","CancelDefaultMiniMap") == 1 then
  79. return nil
  80. end
  81. return getResFullPath("scene/uiminimap/default.png")
  82. end
  83. return getResFullPath(string.format("scene/uiminimap/%06d.png", miniMapID - 1))
  84. end
  85. function MapProxy:CheckMiniMapAble()
  86. local minimapFile = self:GetMiniMapFile()
  87. if not minimapFile then
  88. return false
  89. end
  90. return global.FileUtilCtl:isFileExist(minimapFile)
  91. end
  92. function MapProxy:GetMapDataID()
  93. if self._property and self._property.sourid then
  94. return self._property.sourid
  95. end
  96. return self:GetMapID()
  97. end
  98. function MapProxy:IsMainPlayerSafeAreaOwn()
  99. return self._mainPlaySafeAreaOwn
  100. end
  101. function MapProxy:HasSafeArea()
  102. if not self._property then
  103. return false
  104. end
  105. if (not self._property.SafePoint) or (not self._property.SafePoint[1]) then
  106. return false
  107. end
  108. return true
  109. end
  110. -- 是否是安全地图
  111. function MapProxy:IsSafeMap()
  112. return bit.band(bit.rshift(self:GetFlag(), 1), 1) == 1
  113. end
  114. function MapProxy:GetInSafeArea(playerMapX, playerMapY, isCheckDistance)
  115. if not playerMapX or not playerMapY then
  116. return false
  117. end
  118. if self:IsSafeMap() then
  119. return true
  120. end
  121. if not self:HasSafeArea() then
  122. return false
  123. end
  124. local playerPoint = cc.p(playerMapX, playerMapY)
  125. local safePoint = self._property.SafePoint
  126. local distance = nil
  127. for i,point in ipairs(safePoint) do
  128. if ((playerMapY - point[2]) * (point[3] - point[1]) - (playerMapX - point[1]) * (point[4] - point[2]) <= 0) and
  129. ((playerMapY - point[4]) * (point[5] - point[3]) - (playerMapX - point[3]) * (point[6] - point[4]) <= 0) and
  130. ((playerMapY - point[6]) * (point[7] - point[5]) - (playerMapX - point[5]) * (point[8] - point[6]) <= 0) and
  131. ((playerMapY - point[8]) * (point[1] - point[7]) - (playerMapX - point[7]) * (point[2] - point[8]) <= 0) then
  132. self._safeAreaID = point[9]
  133. return true
  134. end
  135. if isCheckDistance then
  136. if not distance then
  137. distance = getDistancePointToLine(cc.p(point[1], point[2]), cc.p(point[3], point[4]), playerPoint)
  138. else
  139. distance = math.min(getDistancePointToLine(cc.p(point[1], point[2]), cc.p(point[3], point[4]), playerPoint), distance)
  140. end
  141. distance = math.min(getDistancePointToLine(cc.p(point[3], point[4]), cc.p(point[5], point[6]), playerPoint), distance)
  142. distance = math.min(getDistancePointToLine(cc.p(point[5], point[6]), cc.p(point[7], point[8]), playerPoint), distance)
  143. distance = math.min(getDistancePointToLine(cc.p(point[7], point[8]), cc.p(point[1], point[2]), playerPoint), distance)
  144. end
  145. end
  146. return false, distance
  147. end
  148. function MapProxy:UpdateInSafeAreaState()
  149. local mainPlayer = global.gamePlayerController:GetMainPlayer()
  150. if not mainPlayer then
  151. return false
  152. end
  153. local mapX = mainPlayer:GetMapX()
  154. local mapY = mainPlayer:GetMapY()
  155. local inSafeArea, distance = self:GetInSafeArea(mapX, mapY, true)
  156. inSafeArea = inSafeArea or (bit.band(bit.rshift(self:GetFlag(), 1), 1) == 1)--地图标记(安全区域)
  157. local maxDistance = 16
  158. distance = distance or maxDistance
  159. self._mainPlaySafeAreaOwn = distance > maxDistance
  160. if inSafeArea ~= self._inSafeArea then
  161. self._inSafeArea = inSafeArea
  162. global.Facade:sendNotification(global.NoticeTable.MapStateChange, self:IsInSafeArea())
  163. SLBridge:onLUAEvent(LUA_EVENT_MAP_STATE_CHANGE, self._inSafeArea)
  164. if self._safeAreaID then
  165. local safeAreaID = self._safeAreaID
  166. if not inSafeArea then
  167. self._safeAreaID = nil
  168. end
  169. if safeAreaID > 0 then
  170. LuaSendMsg(global.MsgType.MSG_CS_CHANGESAFEAREA, inSafeArea and 1 or 0, safeAreaID)
  171. end
  172. end
  173. end
  174. end
  175. -- 是否在安全区域
  176. function MapProxy:IsInSafeArea()
  177. return self._inSafeArea
  178. end
  179. -- 是否可以穿人
  180. function MapProxy:IsCrossPlayerEnable()
  181. -- 攻城战 禁止穿所有
  182. if self._isSiegeWar and self._property.WarDisAll == 1 then
  183. return false
  184. end
  185. return self._property.througHHum == 1 or self._property.througHHum == 3 or self._property.RunHuman == 1
  186. end
  187. -- 是否可以穿怪
  188. function MapProxy:IsCrossMonsterEnable()
  189. -- 攻城战 禁止穿所有
  190. if self._isSiegeWar and self._property.WarDisAll == 1 then
  191. return false
  192. end
  193. return self._property.througHHum == 2 or self._property.througHHum == 1 or self._property.RunMon == 1
  194. end
  195. -- 是否可以穿NPC
  196. function MapProxy:IsCrossNpcEnable()
  197. -- 攻城战 禁止穿所有
  198. if self._isSiegeWar and self._property.WarDisAll == 1 then
  199. return false
  200. end
  201. return self._property.RunNpc == 1
  202. end
  203. -- 是否可以穿守卫
  204. function MapProxy:IsCrossDefenderEnable()
  205. -- 攻城战 禁止穿所有
  206. if self._isSiegeWar and self._property.WarDisAll == 1 then
  207. return false
  208. end
  209. return CHECK_SERVER_OPTION("RunGuard") == 1
  210. end
  211. function MapProxy:IsCrossAllSafeArea()
  212. return CHECK_SERVER_OPTION("SafeZoneRunAll")
  213. end
  214. -- 安全区禁止穿NPC
  215. function MapProxy:IsFirbidCrossNpcSafeArea()
  216. return CHECK_SERVER_OPTION("DisRunSafeZoneNpc")
  217. end
  218. -- 安全区禁止穿摆摊玩家
  219. function MapProxy:IsFirbidCrossStallSafeArea()
  220. return CHECK_SERVER_OPTION("DisRunSafeZoneStall")
  221. end
  222. -- 安全区禁止穿离线玩家
  223. function MapProxy:IsFirbidCrossOfflineSafeArea()
  224. return CHECK_SERVER_OPTION("DisRunSafeZoneOffline")
  225. end
  226. -- 管理员穿所有
  227. function MapProxy:IsGMRunAll()
  228. return CHECK_SERVER_OPTION("GMRunAll")
  229. end
  230. -- 是否是管理员
  231. function MapProxy:IsAdmin()
  232. return self._property.isAdmin or CHECK_SERVER_OPTION("isAdmin")
  233. end
  234. -- 是否允许走路穿人
  235. function MapProxy:IsAbleWalkCrossPlayer()
  236. return self._property.WALKHuman == 1
  237. end
  238. -- 是否允许走路穿怪
  239. function MapProxy:IsAbleWalkCrossMonster()
  240. return self._property.WALKMON == 1 or self._property.througHHum == 2 or self._property.througHHum == 1
  241. end
  242. -- 能否改变攻击模式
  243. function MapProxy:IsChangePKStateEnable()
  244. return self._property.ChangeAttMode == 0
  245. end
  246. -- 地图标记
  247. function MapProxy:GetFlag()
  248. return self._property.MapFlag or 0
  249. end
  250. -- 行会战地图标识 取值16 按位取值5
  251. function MapProxy:IsMapWar()
  252. local mapFlag = self:GetFlag()
  253. return bit.band(bit.rshift(mapFlag, 4), 1) == 1
  254. end
  255. -- 吃物品速度
  256. function MapProxy:GetEatItemSpeed()
  257. return CHECK_SERVER_OPTION("EatItemSpeed")
  258. end
  259. -- 击NPC间隔
  260. function MapProxy:GetClickNpcSpeed()
  261. return CHECK_SERVER_OPTION("ClickNpcSpeed") or 100
  262. end
  263. -- 转向间隔
  264. function MapProxy:GetTurnIntervalTime()
  265. return (CHECK_SERVER_OPTION("TurnIntervalTime") or 200) + (global.MMO.NETWORK_DELAY * 1000)
  266. end
  267. -- 使用毒符方式(0:穿戴,1:背包,2:无)
  268. function MapProxy:GetUseAmuletType()
  269. return CHECK_SERVER_OPTION("UseAmuletType")
  270. end
  271. -- 背景音乐
  272. function MapProxy:GetMapBGM()
  273. return self._property.MusicID
  274. end
  275. -- 浑水摸鱼 禁止显示行会名
  276. function MapProxy:IsForbidGuild()
  277. return Forbids.GUILD
  278. end
  279. -- 浑水摸鱼 禁止显示等级和职业
  280. function MapProxy:IsForbidLvJob()
  281. return Forbids.JOBLV
  282. end
  283. -- 浑水摸鱼 禁止说话
  284. function MapProxy:IsForbidSay()
  285. return Forbids.SAY
  286. end
  287. -- 浑水摸鱼 禁止查看
  288. function MapProxy:IsForbidVisitPlayer()
  289. return Forbids.CHECK
  290. end
  291. -- 浑水摸鱼 血量显示百分比
  292. function MapProxy:IsHPPercent()
  293. return Forbids.HPPER
  294. end
  295. -- 是否统一名字
  296. function MapProxy:IsUnitiveName()
  297. return Forbids.NAME
  298. end
  299. -- 获取统一名字
  300. function MapProxy:GetUnitiveName()
  301. -- 后端统一改
  302. if not self:IsUnitiveName() then
  303. return "ERROR UNITIVE NAME"
  304. end
  305. if not self._property.SecretConfig or "" == self._property.SecretConfig then
  306. return "ERROR UNITIVE NAME"
  307. end
  308. local slices = ssplit(self._property.SecretConfig, "|")
  309. return tostring(slices[2])
  310. end
  311. function MapProxy:SetForbidData()
  312. if not self._property.SecretConfig or "" == self._property.SecretConfig then
  313. Forbids.GUILD = false
  314. Forbids.JOBLV = false
  315. Forbids.SAY = false
  316. Forbids.CHECK = false
  317. Forbids.HPPER = false
  318. Forbids.NAME = false
  319. else
  320. local slices = ssplit(self._property.SecretConfig, "|")
  321. local option = tonumber(slices[1])
  322. local value1 = bit.band(bit.rshift(option, 0), 1)
  323. local value2 = bit.band(bit.rshift(option, 2), 1)
  324. local value3 = bit.band(bit.rshift(option, 3), 1)
  325. local value5 = bit.band(bit.rshift(option, 5), 1)
  326. Forbids.GUILD = option > 32
  327. Forbids.JOBLV = option > 32
  328. Forbids.SAY = value1 == 1
  329. Forbids.CHECK = value2 == 1
  330. Forbids.NAME = value3 == 1
  331. Forbids.HPPER = value5 == 1
  332. end
  333. end
  334. -- 后仰 时间
  335. function MapProxy:GetStuckActionTime()
  336. return self._property.StruckTime
  337. end
  338. --是否可以放某个技能
  339. function MapProxy:IsForbidLaunchSkill(skillID)
  340. if not self._property.NotAllowUseMagic or self._property.NotAllowUseMagic == "" then
  341. return false
  342. end
  343. local SkillProxy = global.Facade:retrieveProxy(global.ProxyTable.Skill)
  344. local slices = ssplit(self._property.NotAllowUseMagic, "|")
  345. for _, v in pairs(slices) do
  346. local tid = SkillProxy:GetSkillIDByName(v)
  347. if tid == skillID then
  348. return true
  349. end
  350. end
  351. return false
  352. end
  353. --是否在沙巴克区域
  354. function MapProxy:CheckShaBeKeZone(mapX, mapY)
  355. if not mapX or not mapY then
  356. return false
  357. end
  358. if self._shabakeZone.isMapGloabl then
  359. return true
  360. end
  361. if not self._shabakeZone.finish then
  362. self._shabakeZone.finish = true
  363. local cPointX = tonumber(SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_HOME_X))
  364. local cPointY = tonumber(SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_HOME_Y))
  365. local rangeX = tonumber(SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_RANGE_X))
  366. local rangeY = tonumber(SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_RANGE_Y))
  367. if cPointX or cPointY then
  368. self._shabakeZone.cPoint = cc.p(cPointX or 0, cPointY or 0)
  369. end
  370. if rangeX or rangeY then
  371. self._shabakeZone.range = cc.p(rangeX or 0, rangeY or 0)
  372. end
  373. end
  374. if self._shabakeZone.cPoint and self._shabakeZone.range then
  375. if math.abs(self._shabakeZone.cPoint.x-mapX) < self._shabakeZone.range.x
  376. and math.abs(self._shabakeZone.cPoint.y-mapY) < self._shabakeZone.range.y then
  377. return true
  378. end
  379. end
  380. return false
  381. end
  382. -- 是否在攻城区域
  383. function MapProxy:IsInSiegeArea()
  384. return self._isSiegeWar
  385. end
  386. -----------------------------------------------------------------------------
  387. function MapProxy:RequestOpenDoor(px, py)
  388. if not self._openDoorAble then
  389. return false
  390. end
  391. self._openDoorAble = false
  392. PerformWithDelayGlobal(function()
  393. self._openDoorAble = true
  394. end, 0.5)
  395. if global.sceneManager:canOpenDoor(px, py) then
  396. LuaSendMsg(global.MsgType.MSG_CS_OPEN_DOOR_REQUEST, 0, px, py)
  397. end
  398. end
  399. function MapProxy:handle_MSG_SC_MAP_CHANGE(msg)
  400. local msgHdr = msg:GetHeader()
  401. local param3 = msgHdr.param3
  402. local througHHum = self._property.througHHum
  403. self._lastMapID = self:GetMapID()
  404. local jsonData = ParseRawMsgToJson(msg)
  405. jsonData.RunHuman = jsonData.RunHuman or bit.band(bit.rshift(param3, 0), 0x1)
  406. jsonData.RunMon = jsonData.RunMon or bit.band(bit.rshift(param3, 1), 0x1)
  407. jsonData.RunNpc = jsonData.RunNpc or bit.band(bit.rshift(param3, 2), 0x1)
  408. jsonData.WarDisAll = jsonData.WarDisAll or bit.band(bit.rshift(param3, 3), 0x1)
  409. jsonData.WALKMON = jsonData.WALKMON or bit.band(bit.rshift(param3, 4), 0x1)
  410. jsonData.WALKHuman = jsonData.WALKHuman or bit.band(bit.rshift(param3, 5), 0x1)
  411. jsonData.isAdmin = jsonData.isAdmin or bit.band(bit.rshift(param3, 6), 0x1) == 1
  412. -- 表头那个值包含128, 对应mapflag+4
  413. if bit.band(bit.rshift(param3, 7), 0x1) == 1 then
  414. local mapFlag = tonumber(jsonData.MapFlag) or 0
  415. jsonData.MapFlag = mapFlag + 4
  416. end
  417. -- 黑夜
  418. local DarkLayerProxy = global.Facade:retrieveProxy(global.ProxyTable.DarkLayerProxy)
  419. if bit.band(bit.rshift(param3, 8), 0x1) == 1 then
  420. jsonData.DayLight = jsonData.DayLight or DarkLayerProxy.STATE.night
  421. elseif bit.band(bit.rshift(param3, 9), 0x1) == 1 then
  422. jsonData.DayLight = jsonData.DayLight or DarkLayerProxy.STATE.sunrise
  423. elseif bit.band(bit.rshift(param3, 10), 0x1) == 1 then
  424. jsonData.DayLight = jsonData.DayLight or DarkLayerProxy.STATE.evening
  425. end
  426. if bit.band(bit.rshift(param3, 11), 0x1) == 1 then
  427. jsonData.EnableDayLight = jsonData.EnableDayLight or DarkLayerProxy.MODE.dark
  428. end
  429. self._safeAreaID = nil
  430. self._property.SafePoint = nil
  431. self._property = jsonData
  432. self._property.througHHum = througHHum
  433. self:SetForbidData()
  434. local date = os.date("*t")
  435. print("--------------------------", string.format("%s/%s/%s %s:%s:%s", date.year, date.month, date.day, date.hour, date.min, date.sec))
  436. dump(jsonData, "_________handle_MSG_SC_MAP_CHANGE")
  437. local msgHdr = msg:GetHeader()
  438. local mapX = msgHdr.param1
  439. local mapY = msgHdr.param2
  440. global.gamePlayerController:OnChangeScene(mapX, mapY)
  441. -- print("切换地图")
  442. local mediator = global.Facade:retrieveMediator("NoticeMediator")
  443. local proxy = global.Facade:retrieveProxy("NoticeProxy")
  444. if mediator:GetEffectsData()[2] then
  445. for _,v in ipairs(mediator:GetEffectsData()[2]) do
  446. global.Facade:sendNotification(global.NoticeTable.Layer_Notice_RemoveChild, tostring(v))
  447. end
  448. mediator:GetEffectsData()[2] = {}
  449. end
  450. --light state
  451. if DarkLayerProxy then
  452. if jsonData.EnableDayLight then
  453. DarkLayerProxy:setMode(jsonData.EnableDayLight)
  454. end
  455. if jsonData.DayLight then
  456. DarkLayerProxy:setState(jsonData.DayLight)
  457. end
  458. end
  459. local root = global.sceneGraphCtl:GetSceneNode(global.MMO.NODE_DAMAGE)
  460. local sfxParent = root:getChildByName("MAP_SFX_PARENT")
  461. if sfxParent then
  462. sfxParent:removeFromParent()
  463. sfxParent = nil
  464. end
  465. self._shabakeZone.isMapGloabl = false
  466. self._isCheckShaBaKeZone = jsonData.MapId == SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_MAP_NAME)
  467. if not self._isCheckShaBaKeZone then
  468. self._isCheckShaBaKeZone = jsonData.MapId == SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_MAP_PALACE)
  469. self._shabakeZone.isMapGloabl = self._isCheckShaBaKeZone
  470. end
  471. if not self._isCheckShaBaKeZone then
  472. self._isCheckShaBaKeZone = jsonData.MapId == SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_MAP_SECRET)
  473. self._shabakeZone.isMapGloabl = self._isCheckShaBaKeZone
  474. end
  475. global.actorInViewController:Cleanup()
  476. global.HUDHPManager:Cleanup()
  477. self:UpdateInSafeAreaState()
  478. global.Facade:sendNotification(global.NoticeTable.ChangeScene, self:GetMapID(), self._lastMapID)
  479. -- 告诉服务器游戏帧率
  480. local fps = global.Director:getFrameRate()
  481. local mapID = self:GetMapID()
  482. LuaSendMsg(global.MsgType.MSG_CS_NOTICE_FPS, fps, 0, 0, 0, mapID, string.len(mapID))
  483. global.Facade:sendNotification(global.NoticeTable.AppViewNameChange, {isTest = true})
  484. --跨服状态
  485. if jsonData.NewClientKuafuState then
  486. local ServerTimeProxy = global.Facade:retrieveProxy(global.ProxyTable.ServerTimeProxy)
  487. local lastStatus = ServerTimeProxy:IsKfState()
  488. ServerTimeProxy:SetKFState(jsonData.NewClientKuafuState)
  489. if lastStatus ~= (jsonData.NewClientKuafuState == 1) then
  490. global.Facade:sendNotification(global.NoticeTable.Cross_Server_Status_Change, jsonData.NewClientKuafuState)
  491. SLBridge:onLUAEvent(LUA_EVENT_KF_STATUS_CHANGE, jsonData.NewClientKuafuState == 1)
  492. end
  493. end
  494. end
  495. function MapProxy:handle_MSG_SC_ENTER_SAFE_AREA(msg)
  496. -- TODO
  497. local header = msg:GetHeader()
  498. local state = header.recog
  499. self._inSafeArea = (state == 0)
  500. global.Facade:sendNotification(global.NoticeTable.MapStateChange, self:IsInSafeArea())
  501. end
  502. function MapProxy:RespSiegeWarStatus(msg)
  503. -- 是否进入城堡(1是进入; 0是离开)
  504. local header = msg:GetHeader()
  505. self._isSiegeWar = (header.recog == 1)
  506. global.Facade:sendNotification(global.NoticeTable.SiegeAreaChange, self._isSiegeWar)
  507. SLBridge:onLUAEvent(LUA_EVENT_MAP_SIEGEAREA_CHANGE, self._isSiegeWar)
  508. end
  509. --safe zone
  510. function MapProxy:IsCheckSafeZone( actor )
  511. if self._shabakeZone.isMapGloabl then
  512. return false
  513. end
  514. if not self:HasSafeArea() then
  515. return false
  516. end
  517. if actor:IsMonster() and self:IsCrossMonsterEnable() then
  518. return false
  519. end
  520. if actor:IsPlayer() and self:IsCrossPlayerEnable() then
  521. return false
  522. end
  523. if self:IsMainPlayerSafeAreaOwn() then
  524. local mainPlayer = global.gamePlayerController:GetMainPlayer()
  525. if mainPlayer and not mainPlayer:IsDie() and not mainPlayer:IsDeath() then
  526. return false
  527. end
  528. end
  529. return true
  530. end
  531. function MapProxy:handle_MSG_SC_RESPONE_SCENE_SHAKE(msg)
  532. local header = msg:GetHeader()
  533. local shakeLevel = header.recog
  534. local shakeTimes = header.param1 or 0
  535. if not shakeLevel or shakeTimes < 1 then
  536. return false
  537. end
  538. if self._shakeGlobalHandle then
  539. global.Scheduler:unscheduleScriptEntry(self._shakeGlobalHandle)
  540. end
  541. self._shakeGlobalHandle = nil
  542. local function shakeFunc(time, count, distance)
  543. if time >= count then
  544. return false
  545. end
  546. local delayTime = 1000
  547. global.Facade:sendNotification(global.NoticeTable.ShakeScene, {time = delayTime, distance = distance})
  548. self._shakeGlobalHandle = PerformWithDelayGlobal(function()
  549. self._shakeGlobalHandle = nil
  550. shakeFunc(time+1, count, distance)
  551. end, delayTime * 0.001)
  552. end
  553. local distance = (({3, 5, 7})[shakeLevel]) or 20
  554. shakeFunc(0, shakeTimes, distance)
  555. end
  556. -- 穿人穿怪
  557. function MapProxy:handle_MSG_SM_THROUGHHUM(msg)
  558. local header = msg:GetHeader()
  559. if self._property.througHHum ~= header.param1 then
  560. self._property.througHHum = header.param1
  561. global.Facade:sendNotification(global.NoticeTable.Map_Refresh_Throug_HHum)
  562. end
  563. end
  564. -- 播放特效
  565. function MapProxy:handle_MSG_SC_MAP_PLAY_EFFECT(msg)
  566. local msgHdr = msg:GetHeader()
  567. if not msgHdr.param1 or msgHdr.param1 == 0 then
  568. return
  569. end
  570. -- 播放特效
  571. local sfxAnim = global.FrameAnimManager:CreateSFXAnim(msgHdr.param1)
  572. if not sfxAnim then
  573. return
  574. end
  575. local root = global.sceneGraphCtl:GetSceneNode(global.MMO.NODE_DAMAGE)
  576. local sfxParent = root:getChildByName("MAP_SFX_PARENT")
  577. if not sfxParent then
  578. sfxParent = cc.Node:create()
  579. sfxParent:setName("MAP_SFX_PARENT")
  580. root:addChild(sfxParent, 999)
  581. end
  582. sfxParent:addChild(sfxAnim, msgHdr.param1)
  583. local sfxPos = global.sceneManager:MapPos2WorldPos(msgHdr.param2, msgHdr.param3)
  584. sfxAnim:setPosition(sfxPos.x, sfxPos.y)
  585. sfxAnim:Play(0, 0)
  586. local function removeEvent()
  587. sfxAnim:removeFromParent()
  588. end
  589. sfxAnim:SetAnimEventCallback(removeEvent)
  590. end
  591. --场景切换时的配置修改
  592. function MapProxy:handle_MSG_MSG_SM_MAP_CONFIG(msg)
  593. local jsonData = ParseRawMsgToJson(msg)
  594. if jsonData and next(jsonData) then
  595. if not self._property or not next(self._property) then
  596. self._property = {}
  597. end
  598. for k,v in pairs(jsonData) do
  599. self._property[k] = v
  600. end
  601. self:SetForbidData()
  602. global.Facade:sendNotification(global.NoticeTable.Map_Refresh_Throug_HHum)
  603. end
  604. end
  605. --服务器开关配置修改
  606. function MapProxy:handle_MSG_SM_CASTLEMAPINFO(msg)
  607. local jsonData = ParseRawMsgToJson(msg) or {}
  608. if not next(jsonData) then
  609. return
  610. end
  611. -- 服务器开关
  612. local ServerOptionsProxy = global.Facade:retrieveProxy(global.ProxyTable.ServerOptionsProxy)
  613. for k, v in pairs(jsonData) do
  614. ServerOptionsProxy:setOptionByKey(k,v)
  615. end
  616. if not self._shabakeZone.isMapGloabl then
  617. local mapID = self:GetMapID()
  618. self._isCheckShaBaKeZone = mapID == SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_MAP_NAME)
  619. if not self._isCheckShaBaKeZone then
  620. self._isCheckShaBaKeZone = mapID == SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_MAP_PALACE)
  621. self._shabakeZone.isMapGloabl = self._isCheckShaBaKeZone
  622. end
  623. if not self._isCheckShaBaKeZone then
  624. self._isCheckShaBaKeZone = mapID == SL:GetMetaValue("SERVER_OPTIONS", global.MMO.SERVER_SHABAKE_MAP_SECRET)
  625. self._shabakeZone.isMapGloabl = self._isCheckShaBaKeZone
  626. end
  627. end
  628. global.Facade:sendNotification(global.NoticeTable.RefreshGuildActorColor )
  629. end
  630. function MapProxy:RegisterMsgHandler()
  631. MapProxy.super.RegisterMsgHandler(self)
  632. local msgType = global.MsgType
  633. LuaRegisterMsgHandler(msgType.MSG_SC_MAP_CHANGE, handler(self, self.handle_MSG_SC_MAP_CHANGE)) -- 切换地图
  634. LuaRegisterMsgHandler(msgType.MSG_SC_MAP_INIT, handler(self, self.handle_MSG_SC_MAP_CHANGE)) -- 初始地图
  635. LuaRegisterMsgHandler(msgType.MSG_SC_ENTER_SAFE_AREA, handler(self, self.handle_MSG_SC_ENTER_SAFE_AREA)) -- 安全区域相关
  636. LuaRegisterMsgHandler(msgType.MSG_SC_SIEGEWAR_STATUS_CHANGE, handler(self, self.RespSiegeWarStatus)) -- 攻城状态
  637. LuaRegisterMsgHandler(msgType.MSG_SC_RESPONE_SCENE_SHAKE, handler(self, self.handle_MSG_SC_RESPONE_SCENE_SHAKE)) -- 屏幕震动
  638. LuaRegisterMsgHandler(msgType.MSG_SM_THROUGHHUM, handler(self, self.handle_MSG_SM_THROUGHHUM)) -- 穿人穿怪消息
  639. LuaRegisterMsgHandler(msgType.MSG_SC_MAP_PLAY_EFFECT, handler(self, self.handle_MSG_SC_MAP_PLAY_EFFECT)) -- 在场景播放特效
  640. LuaRegisterMsgHandler(msgType.MSG_SM_MAP_CONFIG, handler(self, self.handle_MSG_MSG_SM_MAP_CONFIG)) -- 场景切换时的配置修改
  641. LuaRegisterMsgHandler(msgType.MSG_SM_CASTLEMAPINFO, handler(self, self.handle_MSG_SM_CASTLEMAPINFO)) -- 服务器开关配置修改
  642. end
  643. function MapProxy:onRegister()
  644. MapProxy.super.onRegister(self)
  645. -- 主玩家
  646. local function actCallback(actor, act)
  647. -- update in safe zone
  648. if not self:HasSafeArea() and not self:IsCheckShaBaKeZone() then
  649. return nil
  650. end
  651. if IsMoveAction(act) then
  652. global.Facade:sendNotification(global.NoticeTable.RefreshActorSafeZone, actor:GetID())
  653. global.Facade:sendNotification(global.NoticeTable.RefreshActorShaBaKeZone, actor:GetID())
  654. self:UpdateInSafeAreaState()
  655. end
  656. end
  657. global.gamePlayerController:AddHandleOnActBegin(actCallback)
  658. -- 网络玩家
  659. local function actBegin(actor, act)
  660. -- update in safe zone
  661. if not self:HasSafeArea() and not self:IsCheckShaBaKeZone() then
  662. return nil
  663. end
  664. if self:IsCrossPlayerEnable() and not self:IsCheckShaBaKeZone() then
  665. return nil
  666. end
  667. if self:IsMainPlayerSafeAreaOwn() and not self:IsCheckShaBaKeZone() then
  668. return nil
  669. end
  670. if IsMoveAction(act) then
  671. global.Facade:sendNotification(global.NoticeTable.RefreshActorSafeZone, actor:GetID())
  672. global.Facade:sendNotification(global.NoticeTable.RefreshActorShaBaKeZone, actor:GetID())
  673. end
  674. end
  675. global.netPlayerController:AddHandleOnActBegin(actBegin)
  676. -- 怪物
  677. local function actBegin(actor, act)
  678. -- update in safe zone
  679. if not self:HasSafeArea() and not self:IsCheckShaBaKeZone() then
  680. return nil
  681. end
  682. if self:IsCrossMonsterEnable() and not self:IsCheckShaBaKeZone() then
  683. return nil
  684. end
  685. if self:IsMainPlayerSafeAreaOwn() and not self:IsCheckShaBaKeZone() then
  686. return nil
  687. end
  688. if IsMoveAction(act) then
  689. global.Facade:sendNotification(global.NoticeTable.RefreshActorSafeZone, actor:GetID())
  690. global.Facade:sendNotification(global.NoticeTable.RefreshActorShaBaKeZone, actor:GetID())
  691. end
  692. end
  693. global.netMonsterController:AddHandleOnActBegin(actBegin)
  694. end
  695. return MapProxy