From 9e882e618829c680887c0bbed098b1325d9f1000 Mon Sep 17 00:00:00 2001 From: MrZ_26 <1046101471@qq.com> Date: Thu, 3 Nov 2022 12:23:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A1=86=E6=9E=B6=E8=B7=9F=E8=BF=9B=20?= =?UTF-8?q?=E6=8E=A8=E8=BF=9B=E4=B8=AD=E9=80=94=E5=8A=A0=E5=85=A5=E6=88=BF?= =?UTF-8?q?=E9=97=B4=E7=9A=84=E8=A7=82=E6=88=98=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zframework | 2 +- main.lua | 8 ++++---- parts/net.lua | 35 ++++++++++++++++++++++++++++++----- parts/player/player.lua | 2 +- parts/scenes/error.lua | 2 +- parts/scenes/main.lua | 2 +- parts/scenes/net_game.lua | 5 +++-- 7 files changed, 41 insertions(+), 15 deletions(-) diff --git a/Zframework b/Zframework index 632e95d4..6581acd9 160000 --- a/Zframework +++ b/Zframework @@ -1 +1 @@ -Subproject commit 632e95d48d3af9c2694782366a3cd26b4940bc8d +Subproject commit 6581acd9e8c81764b4aeb275264b3f09628c8e46 diff --git a/main.lua b/main.lua index 479c1590..fec7c8d1 100644 --- a/main.lua +++ b/main.lua @@ -60,11 +60,11 @@ BGM.setMaxSources(5) VOC.setDiversion(.62) WIDGET.setOnChange(function() - if SCN.stack[#SCN.stack]~='custom_field' then + if SCN.current~='custom_field' then local colorList=THEME.getThemeColor() if not colorList then return end local rnd=math.random - for _,W in next,SCN.scenes[SCN.stack[#SCN.stack]].widgetList do + for _,W in next,SCN.scenes[SCN.current].widgetList do if W.color then W.color=colorList[rnd(#colorList)] end @@ -218,10 +218,10 @@ do-- Z.setOnFocus TASK.new(task_autoSoundOn) end else - if SCN.stack[#SCN.stack]=='game' and SETTING.autoPause then + if SCN.current=='game' and SETTING.autoPause then pauseGame() end - if SETTING.autoMute and SCN.stack[#SCN.stack]~='music' then + if SETTING.autoMute and SCN.current~='music' then TASK.removeTask_code(task_autoSoundOn) TASK.new(task_autoSoundOff) end diff --git a/parts/net.lua b/parts/net.lua index fcfd121a..17e42dfb 100644 --- a/parts/net.lua +++ b/parts/net.lua @@ -3,6 +3,7 @@ local WS=WS local NET={ uid=false, uid_sid={}, + storedStream={}, roomState={-- A copy of room structure on server info={ @@ -18,7 +19,7 @@ local NET={ }, capacity=false, private=false, - state='Playing', + state='Standby', }, spectate=false,-- If player is spectating @@ -439,7 +440,7 @@ end --Remove player when leave local function _playerLeaveRoom(uid) - if SCN.stack[#SCN.stack]=='net_game' then + if SCN.current=='net_game' then for i=1,#PLAYERS do if PLAYERS[i].uid==uid then table.remove(PLAYERS,i) break end end for i=1,#PLY_ALIVE do if PLY_ALIVE[i].uid==uid then table.remove(PLY_ALIVE,i) break end end if uid==USER.uid then @@ -585,7 +586,7 @@ function NET.wsCallBack.global_getOnlineCount(body) NET.onlineCount=tonumber(body.data) or "_" end function NET.wsCallBack.room_chat(body) - if SCN.stack[#SCN.stack]=='net_game' then + if SCN.current=='net_game' then TASK.unlock('receiveMessage') TASK.lock('receiveMessage',1) NET.textBox:push{ @@ -623,6 +624,8 @@ function NET.wsCallBack.room_enter(body) NET.roomState=body.data NETPLY.clear() + destroyPlayers() + TABLE.cut(NET.storedStream) loadGame('netBattle',true,true) for _,p in next,body.data.players do NETPLY.add{ @@ -634,7 +637,18 @@ function NET.wsCallBack.room_enter(body) config=p.config, } end - NET.freshRoomAllReady() + if NET.roomState.state=='Playing' then + for _,p in next,body.data.players do + table.insert(NET.storedStream,{ + playerId=p.playerId, + data=p.history, + }) + end + NET.seed=body.data.seed + TASK.lock('netPlaying') + else + NET.freshRoomAllReady() + end else local p=body.data NETPLY.add{ @@ -670,18 +684,22 @@ function NET.wsCallBack.room_fetch(body) SCN.scenes.net_rooms.widgetList.roomList:setList(body.data) end function NET.wsCallBack.room_setPW() + if SCN.current~='net_game' then return end MES.new(text.roomPasswordChanged) end function NET.wsCallBack.room_remove() + if SCN.current~='net_game' then return end MES.new('info',text.roomRemoved) _playerLeaveRoom(USER.uid) end function NET.wsCallBack.player_updateConf(body) + if SCN.current~='net_game' then return end if type(body.data)=='table' then NETPLY.map[body.data.playerId].config=body.data.config end end function NET.wsCallBack.player_finish(body) + if SCN.current~='net_game' then return end for _,P in next,PLY_ALIVE do if P.uid==body.data.playerId then P.loseTimer=26 @@ -691,9 +709,11 @@ function NET.wsCallBack.player_finish(body) end end function NET.wsCallBack.player_joinGroup(body) + if SCN.current~='net_game' then return end NETPLY.map[body.data.playerId].group=body.data.group end function NET.wsCallBack.player_setHost(body) + if SCN.current~='net_game' then return end if body.data.role=='Admin' then MES.new('info',text.becomeHost:repD(_getFullName(body.data.playerId))) end @@ -702,17 +722,21 @@ end function NET.wsCallBack.player_setState(body)-- not used end function NET.wsCallBack.player_stream(body) + if SCN.current~='net_game' then return end _pumpStream(body.data) end function NET.wsCallBack.player_setPlayMode(body) + if SCN.current~='net_game' then return end NETPLY.map[body.data.playerId].playMode=body.data.type NET.freshRoomAllReady() end function NET.wsCallBack.player_setReadyMode(body) + if SCN.current~='net_game' then return end NETPLY.map[body.data.playerId].readyMode=body.data.isReady and 'Ready' or 'Standby' NET.freshRoomAllReady() end function NET.wsCallBack.match_finish() + if SCN.current~='net_game' then return end for _,P in next,PLAYERS do NETPLY.setStat(P.uid,P.stat) end @@ -724,6 +748,7 @@ end function NET.wsCallBack.match_ready()-- not used end function NET.wsCallBack.match_start(body) + if SCN.current~='net_game' then return end TASK.lock('netPlaying') NET.seed=body.data and body.data.seed if not NET.seed then @@ -804,7 +829,7 @@ function NET.ws_update() elseif msg then msg=JSON.decode(msg) -- print(("Recv: <-- $1 err:$2"):repD(msg.action,msg.errno)) - -- print(("Recv: <-- $1 err:$2"):repD(msg.action,msg.errno)) print(TABLE.dump(msg),"\n") + print(("Recv: <-- $1 err:$2"):repD(msg.action,msg.errno)) print(TABLE.dump(msg),"\n") if msg.errno~=0 then parseError(msg.message~=nil and msg.message or msg) else diff --git a/parts/player/player.lua b/parts/player/player.lua index e2aeeef9..7b342e6a 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -2192,7 +2192,7 @@ local function task_autoPause() while true do yield() time=time+1 - if SCN.stack[#SCN.stack]~='game' or PLAYERS[1].frameRun<180 then + if SCN.current~='game' or PLAYERS[1].frameRun<180 then return elseif time==120 then pauseGame() diff --git a/parts/scenes/error.lua b/parts/scenes/error.lua index daad5d49..e70270fe 100644 --- a/parts/scenes/error.lua +++ b/parts/scenes/error.lua @@ -6,7 +6,7 @@ local scene={} function scene.sceneInit() BGcolor=math.random()>.026 and{.3,.5,.9} or{.62,.3,.926} - sysAndScn=SYSTEM.."-"..VERSION.string.." scene:"..Z.getErr('#').scene + sysAndScn=SYSTEM.."-"..VERSION.string.." scene:"..Z.getErr('#').scene errorText=LOADED and text.errorMsg or "An error has occurred while the game was loading.\nAn error log has been created so you can send it to the author." errorShot,errorInfo=Z.getErr('#').shot,Z.getErr('#').mes NET.ws_close() diff --git a/parts/scenes/main.lua b/parts/scenes/main.lua index 302dfd24..4add469d 100644 --- a/parts/scenes/main.lua +++ b/parts/scenes/main.lua @@ -22,7 +22,7 @@ function scene.sceneInit() if THEME.cur=='halloween' then TASK.new(function() TEST.yieldT(.26) - while SCN.stack[#SCN.stack]=='main' do + while SCN.current=='main' do flash=.355 SFX.play('clear_'..math.random(4,6),1,math.random()*2-1,-9-math.random()*3) TEST.yieldT(.626+math.random()*6.26) diff --git a/parts/scenes/net_game.lua b/parts/scenes/net_game.lua index f98df03a..43f71637 100644 --- a/parts/scenes/net_game.lua +++ b/parts/scenes/net_game.lua @@ -247,8 +247,9 @@ function scene.update(dt) end end else - NETPLY.update(dt) - if TASK.getLock('netPlaying') and not playing then + if not TASK.getLock('netPlaying') then + NETPLY.update(dt) + else playing=true TASK.lock('netPlaying') lastUpstreamTime=0