From 8b5a96e82543ee888641319ef7f0f22cff70352c Mon Sep 17 00:00:00 2001 From: genxium Date: Sun, 19 Feb 2023 13:42:25 +0800 Subject: [PATCH] Enhanced exception handling on frontend. --- battle_srv/Makefile | 15 ++ battle_srv/common/constants.json | 2 +- battle_srv/common/constants_struct.go | 2 + battle_srv/go.mod | 15 +- battle_srv/go.sum | 4 + battle_srv/models/room.go | 16 +- battle_srv/ws/serve.go | 35 ++-- frontend/assets/plugin_scripts/constants.js | 1 + frontend/assets/resources/map/dungeon/map.tmx | 6 +- .../resources/prefabs/FindingPlayer.prefab | 186 +++++++++--------- frontend/assets/scenes/default_map.fire | 2 +- frontend/assets/scenes/login.fire | 2 +- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/Map.js | 5 +- frontend/assets/scripts/WsSessionMgr.js | 18 +- 15 files changed, 172 insertions(+), 139 deletions(-) diff --git a/battle_srv/Makefile b/battle_srv/Makefile index d17432b..7815f14 100644 --- a/battle_srv/Makefile +++ b/battle_srv/Makefile @@ -4,9 +4,24 @@ ROOT_DIR=. GOPROXY=https://goproxy.io all: help +# To install `gojson` executable +# ``` +# go install github.com/ChimeraCoder/gojson/gojson@latest +# ``` +# +# OS detection reference https://stackoverflow.com/a/12099167 gen-constants: gojson -pkg common -name constants -input common/constants.json -o common/constants_struct.go +ifeq ($(OS),Windows_NT) sed -i 's/int64/int/g' common/constants_struct.go +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Darwin) + sed -i '' -e 's/int64/int/g' common/constants_struct.go + else + sed -i 's/int64/int/g' common/constants_struct.go + endif +endif run-test: build ServerEnv=TEST ./$(PROJECTNAME) diff --git a/battle_srv/common/constants.json b/battle_srv/common/constants.json index 1a3b743..3c1f637 100644 --- a/battle_srv/common/constants.json +++ b/battle_srv/common/constants.json @@ -44,10 +44,10 @@ "PASSWORD_RESET_CODE_GENERATION_PER_EMAIL_TOO_FREQUENTLY": 2020, "TRADE_CREATION_TOO_FREQUENTLY": 2021, "MAP_NOT_UNLOCKED": 2022, - "GET_SMS_CAPTCHA_RESP_ERROR_CODE": 2023, "SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY": 2024, "SMS_CAPTCHA_NOT_MATCH": 2025, + "SAME_PLAYER_ALREADY_IN_SAME_ROOM": 2026, "NOT_IMPLEMENTED_YET": 65535 }, diff --git a/battle_srv/common/constants_struct.go b/battle_srv/common/constants_struct.go index a17380c..b19405a 100644 --- a/battle_srv/common/constants_struct.go +++ b/battle_srv/common/constants_struct.go @@ -17,6 +17,7 @@ type constants struct { RetCode struct { ActiveWatchdog int `json:"ACTIVE_WATCHDOG"` BattleStopped int `json:"BATTLE_STOPPED"` + ClientMismatchedRenderFrame int `json:"CLIENT_MISMATCHED_RENDER_FRAME"` Duplicated int `json:"DUPLICATED"` FailedToCreate int `json:"FAILED_TO_CREATE"` FailedToDelete int `json:"FAILED_TO_DELETE"` @@ -51,6 +52,7 @@ type constants struct { PlayerNotAddableToRoom int `json:"PLAYER_NOT_ADDABLE_TO_ROOM"` PlayerNotFound int `json:"PLAYER_NOT_FOUND"` PlayerNotReaddableToRoom int `json:"PLAYER_NOT_READDABLE_TO_ROOM"` + SamePlayerAlreadyInSameRoom int `json:"SAME_PLAYER_ALREADY_IN_SAME_ROOM"` SendEmailTimeout int `json:"SEND_EMAIL_TIMEOUT"` SmsCaptchaNotMatch int `json:"SMS_CAPTCHA_NOT_MATCH"` SmsCaptchaRequestedTooFrequently int `json:"SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY"` diff --git a/battle_srv/go.mod b/battle_srv/go.mod index 0a19de0..fce7b0c 100644 --- a/battle_srv/go.mod +++ b/battle_srv/go.mod @@ -3,6 +3,7 @@ module battle_srv go 1.18 require ( + dnmshared v0.0.0 github.com/Masterminds/squirrel v0.0.0-20180815162352-8a7e65843414 github.com/davecgh/go-spew v1.1.1 github.com/gin-contrib/cors v0.0.0-20180514151808-6f0a820f94be @@ -19,14 +20,12 @@ require ( github.com/thoas/go-funk v0.0.0-20180716193722-1060394a7713 go.uber.org/zap v1.9.1 google.golang.org/protobuf v1.28.1 - - dnmshared v0.0.0 - jsexport v0.0.0 - resolv v0.0.0 + jsexport v0.0.0 + resolv v0.0.0 ) require ( - github.com/ChimeraCoder/gojson v1.0.0 // indirect + github.com/ChimeraCoder/gojson v1.1.0 // indirect github.com/fatih/color v1.7.0 // indirect github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7 // indirect github.com/githubnemo/CompileDaemon v1.0.0 // indirect @@ -44,11 +43,11 @@ require ( golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 // indirect gopkg.in/go-playground/validator.v8 v8.18.2 // indirect - gopkg.in/yaml.v2 v2.2.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) replace ( dnmshared => ../dnmshared - jsexport => ../jsexport - resolv => ../resolv_tailored + jsexport => ../jsexport + resolv => ../resolv_tailored ) diff --git a/battle_srv/go.sum b/battle_srv/go.sum index 9150fe4..7121102 100644 --- a/battle_srv/go.sum +++ b/battle_srv/go.sum @@ -2,6 +2,8 @@ github.com/ByteArena/box2d v1.0.2 h1:f7f9KEQWhCs1n516DMLzi5w6u0MeeE78Mes4fWMcj9k github.com/ByteArena/box2d v1.0.2/go.mod h1:LzEuxY9iCz+tskfWCY3o0ywYBRafDDugdSj+/YGI6sE= github.com/ChimeraCoder/gojson v1.0.0 h1:gAYKGTV+xfQ4+l/4C/nazPbiQDUidG0G3ukAJnE7LNE= github.com/ChimeraCoder/gojson v1.0.0/go.mod h1:nYbTQlu6hv8PETM15J927yM0zGj3njIldp72UT1MqSw= +github.com/ChimeraCoder/gojson v1.1.0 h1:/6S8djl/jColpJGTYniA3xrqJWuKeyEozzPtpr5L4Pw= +github.com/ChimeraCoder/gojson v1.1.0/go.mod h1:nYbTQlu6hv8PETM15J927yM0zGj3njIldp72UT1MqSw= github.com/Masterminds/squirrel v0.0.0-20180815162352-8a7e65843414 h1:VHdYPA0V0YgL97gdjHevN6IVPRX+fOoNMqcYvUAzwNU= github.com/Masterminds/squirrel v0.0.0-20180815162352-8a7e65843414/go.mod h1:xnKTFzjGUiZtiOagBsfnvomW+nJg2usB1ZpordQWqNM= github.com/Pallinder/go-randomdata v0.0.0-20180616180521-15df0648130a h1:0OnS8GR4uI3nau+f/juCZlAq+zCrsHXRJlENrUQ4eU8= @@ -92,3 +94,5 @@ gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2G gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 5fb98fd..9440e52 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -174,16 +174,16 @@ func (pR *Room) updateScore() { pR.Score = calRoomScore(pR.EffectivePlayerCount, pR.Capacity, pR.State) } -func (pR *Room) AddPlayerIfPossible(pPlayerFromDbInit *Player, speciesId int, session *websocket.Conn, signalToCloseConnOfThisPlayer SignalToCloseConnCbType) bool { +func (pR *Room) AddPlayerIfPossible(pPlayerFromDbInit *Player, speciesId int, session *websocket.Conn, signalToCloseConnOfThisPlayer SignalToCloseConnCbType) int { playerId := pPlayerFromDbInit.Id // TODO: Any thread-safety concern for accessing "pR" here? if RoomBattleStateIns.IDLE != pR.State && RoomBattleStateIns.WAITING != pR.State { Logger.Warn("AddPlayerIfPossible error, roomState:", zap.Any("playerId", playerId), zap.Any("roomId", pR.Id), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount)) - return false + return Constants.RetCode.PlayerNotAddableToRoom } if _, existent := pR.Players[playerId]; existent { Logger.Warn("AddPlayerIfPossible error, existing in the room.PlayersDict:", zap.Any("playerId", playerId), zap.Any("roomId", pR.Id), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount)) - return false + return Constants.RetCode.SamePlayerAlreadyInSameRoom } defer pR.onPlayerAdded(playerId, speciesId) @@ -210,19 +210,19 @@ func (pR *Room) AddPlayerIfPossible(pPlayerFromDbInit *Player, speciesId int, se }) newWatchdog.Stop() pR.PlayerActiveWatchdogDict[playerId] = newWatchdog - return true + return Constants.RetCode.Ok } -func (pR *Room) ReAddPlayerIfPossible(pTmpPlayerInstance *Player, session *websocket.Conn, signalToCloseConnOfThisPlayer SignalToCloseConnCbType) bool { +func (pR *Room) ReAddPlayerIfPossible(pTmpPlayerInstance *Player, session *websocket.Conn, signalToCloseConnOfThisPlayer SignalToCloseConnCbType) int { playerId := pTmpPlayerInstance.Id // TODO: Any thread-safety concern for accessing "pR" and "pEffectiveInRoomPlayerInstance" here? if RoomBattleStateIns.PREPARE != pR.State && RoomBattleStateIns.WAITING != pR.State && RoomBattleStateIns.IN_BATTLE != pR.State && RoomBattleStateIns.IN_SETTLEMENT != pR.State && RoomBattleStateIns.IN_DISMISSAL != pR.State { Logger.Warn("ReAddPlayerIfPossible error due to roomState:", zap.Any("playerId", playerId), zap.Any("roomId", pR.Id), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount)) - return false + return Constants.RetCode.PlayerNotReaddableToRoom } if _, existent := pR.Players[playerId]; !existent { Logger.Warn("ReAddPlayerIfPossible error due to player nonexistent for room:", zap.Any("playerId", playerId), zap.Any("roomId", pR.Id), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount)) - return false + return Constants.RetCode.PlayerNotReaddableToRoom } /* * WARNING: The "pTmpPlayerInstance *Player" used here is a temporarily constructed @@ -251,7 +251,7 @@ func (pR *Room) ReAddPlayerIfPossible(pTmpPlayerInstance *Player, session *webso }) // For ReAdded player the new watchdog starts immediately Logger.Warn("ReAddPlayerIfPossible finished.", zap.Any("roomId", pR.Id), zap.Any("playerId", playerId), zap.Any("joinIndex", pEffectiveInRoomPlayerInstance.JoinIndex), zap.Any("playerBattleState", pEffectiveInRoomPlayerInstance.BattleState), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount), zap.Any("AckingFrameId", pEffectiveInRoomPlayerInstance.AckingFrameId), zap.Any("AckingInputFrameId", pEffectiveInRoomPlayerInstance.AckingInputFrameId), zap.Any("LastSentInputFrameId", pEffectiveInRoomPlayerInstance.LastSentInputFrameId)) - return true + return Constants.RetCode.Ok } func (pR *Room) ChooseStage() error { diff --git a/battle_srv/ws/serve.go b/battle_srv/ws/serve.go index e90da18..dc52762 100644 --- a/battle_srv/ws/serve.go +++ b/battle_srv/ws/serve.go @@ -188,34 +188,33 @@ func Serve(c *gin.Context) { }() Logger.Debug("Acquired RoomHeapMux for player:", zap.Any("playerId", playerId)) // Logger.Info("The RoomHeapManagerIns has:", zap.Any("addr", fmt.Sprintf("%p", models.RoomHeapManagerIns)), zap.Any("size", len(*(models.RoomHeapManagerIns)))) - playerSuccessfullyAddedToRoom := false + playerRoomRelation := Constants.RetCode.UnknownError if 0 < boundRoomId { if tmpPRoom, existent := (*models.RoomMapManagerIns)[int32(boundRoomId)]; existent { pRoom = tmpPRoom - res := pRoom.ReAddPlayerIfPossible(pPlayer, conn, signalToCloseConnOfThisPlayer) - if !res { + playerRoomRelation = pRoom.ReAddPlayerIfPossible(pPlayer, conn, signalToCloseConnOfThisPlayer) + if Constants.RetCode.Ok != playerRoomRelation { Logger.Warn("Failed to get:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("forBoundRoomId", boundRoomId)) - } else { - playerSuccessfullyAddedToRoom = true } } } else if 0 < expectedRoomId { if tmpRoom, existent := (*models.RoomMapManagerIns)[int32(expectedRoomId)]; existent { pRoom = tmpRoom - - if pRoom.ReAddPlayerIfPossible(pPlayer, conn, signalToCloseConnOfThisPlayer) { - playerSuccessfullyAddedToRoom = true - } else if pRoom.AddPlayerIfPossible(pPlayer, speciesId, conn, signalToCloseConnOfThisPlayer) { - playerSuccessfullyAddedToRoom = true - } else { - Logger.Warn("Failed to get:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("forExpectedRoomId", expectedRoomId)) - playerSuccessfullyAddedToRoom = false + playerRoomRelation = pRoom.ReAddPlayerIfPossible(pPlayer, conn, signalToCloseConnOfThisPlayer) + if Constants.RetCode.Ok != playerRoomRelation { + playerRoomRelation = pRoom.AddPlayerIfPossible(pPlayer, speciesId, conn, signalToCloseConnOfThisPlayer) + } + if Constants.RetCode.Ok != playerRoomRelation { + Logger.Warn("Failed to get:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("forExpectedRoomId", expectedRoomId)) } - } } - if false == playerSuccessfullyAddedToRoom { + if Constants.RetCode.SamePlayerAlreadyInSameRoom == playerRoomRelation { + signalToCloseConnOfThisPlayer(playerRoomRelation, fmt.Sprintf("playerId == %v is already in a room, this account is possibly stolen!", playerId)) + } + + if Constants.RetCode.Ok != playerRoomRelation { defer func() { if pRoom != nil { heap.Push(models.RoomHeapManagerIns, pRoom) @@ -229,9 +228,9 @@ func Serve(c *gin.Context) { } else { pRoom = tmpRoom Logger.Info("Successfully popped:\n", zap.Any("roomId", pRoom.Id), zap.Any("forPlayerId", playerId)) - res := pRoom.AddPlayerIfPossible(pPlayer, speciesId, conn, signalToCloseConnOfThisPlayer) - if !res { - signalToCloseConnOfThisPlayer(Constants.RetCode.PlayerNotAddableToRoom, fmt.Sprintf("AddPlayerIfPossible returns false for roomId == %v, playerId == %v!", pRoom.Id, playerId)) + playerRoomRelation = pRoom.AddPlayerIfPossible(pPlayer, speciesId, conn, signalToCloseConnOfThisPlayer) + if Constants.RetCode.Ok != playerRoomRelation { + signalToCloseConnOfThisPlayer(playerRoomRelation, fmt.Sprintf("AddPlayerIfPossible returns false for roomId == %v, playerId == %v!", pRoom.Id, playerId)) } } } diff --git a/frontend/assets/plugin_scripts/constants.js b/frontend/assets/plugin_scripts/constants.js index c7dfb91..c44422a 100644 --- a/frontend/assets/plugin_scripts/constants.js +++ b/frontend/assets/plugin_scripts/constants.js @@ -109,6 +109,7 @@ var constants = { "GET_SMS_CAPTCHA_RESP_ERROR_CODE": 2023, "SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY": 2024, "SMS_CAPTCHA_NOT_MATCH": 2025, + "SAME_PLAYER_ALREADY_IN_SAME_ROOM": 2026, "NOT_IMPLEMENTED_YET": 65535 }, diff --git a/frontend/assets/resources/map/dungeon/map.tmx b/frontend/assets/resources/map/dungeon/map.tmx index b2b2d76..93a46ab 100644 --- a/frontend/assets/resources/map/dungeon/map.tmx +++ b/frontend/assets/resources/map/dungeon/map.tmx @@ -1,11 +1,11 @@ - + - + - eJzt2k0OgjAQQGECccMOo+5JvIlx484LeP9jaAxNSEOhlMGZOG/xbfyl81rc2FRV1QAAAAAAAAAAAADAD9zxpd1Bs7/2NWjzPAPPa2cGvtfODHyvnRn4XjszKFv7KdOW6zoKvYb+9vpf6W+G5f5zfZeep7/82kM3qf6Hj25C3DhFYwb/pqT/VlKfQ///7z91f+g2fj/9y/tLWbqfp7rvsQ/ob0tue6l9YHEGlvv3Qq+hv77x2tuBdv/SPVC6P7z3v0XCc/HjQZ8p9X5rwgy0W2j1rwfh/L8+Hgm1gNQZlfjsku/2fv7j/uPfgPFjUv010T/d/xH1niLd47KDNfcc+s/3aRdml2Opv/R+ov+6/ufB3Ny2nP+5PbD3+c/Zn/RP95f8zaW/Pdr/u7ZCu4Nm/6dz9Pdtz/5vZSq2hg== + eJzt2j1uwkAQgFEESkNHlKRHyk2iNHRcIPc/RlCEJWSxtrHHmRX7itfw651v1zTsNpvNDgAAAAAAAOAffPMnu0Nm/+xryNbyDFpeuxm0vXYzaHvtZtD22s1g3trfJlpyXa9Br9G/vv6f+lej5v5Dfcee1z9+7V23qP4vF4c7+o1LMmbwbOb0Xyrqc/R//v737g+Hhd+v//z+Ucbu56Xua+wD/esytX3UPqhxBjX3Pwa9Rv98t2vfX2X3n7sH5u6P1vt/9XTP9R/vHCcqvb823QyyW2T131515//n4lSwDVA6oxGfPee7Wz///f63vwG3j0X1z6R/uf+p1/ue6B4fK3jknqP/cJ/9yOymGOsfvZ/0f6z/+9XQ3Jac/6E9sPb5n7I/9S/3j/zN1b8+2f+7rkV2h8z+58bp37Y1+x8qlz37WmR30F9//fXXX38AAAAAAAAAAAAg1y8jXMSV diff --git a/frontend/assets/resources/prefabs/FindingPlayer.prefab b/frontend/assets/resources/prefabs/FindingPlayer.prefab index ea51677..c00611f 100644 --- a/frontend/assets/resources/prefabs/FindingPlayer.prefab +++ b/frontend/assets/resources/prefabs/FindingPlayer.prefab @@ -22,6 +22,9 @@ }, { "__id__": 5 + }, + { + "__id__": 11 } ], "_active": true, @@ -192,102 +195,28 @@ "fileId": "ab6G+s0otA4rXhUsO3czRN", "sync": false }, - { - "__type__": "cc.Node", - "_name": "VerticalLayout", - "_objFlags": 0, - "_parent": { - "__id__": 1 - }, - "_children": [ - { - "__id__": 6 - }, - { - "__id__": 12 - } - ], - "_active": true, - "_components": [ - { - "__id__": 53 - }, - { - "__id__": 54 - } - ], - "_prefab": { - "__id__": 55 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 960, - "height": 265 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - -9.924, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, { "__type__": "cc.Node", "_name": "exitButton", "_objFlags": 0, "_parent": { - "__id__": 5 + "__id__": 1 }, "_children": [], "_active": true, "_components": [ + { + "__id__": 6 + }, { "__id__": 7 }, { - "__id__": 8 - }, - { - "__id__": 10 + "__id__": 9 } ], "_prefab": { - "__id__": 11 + "__id__": 10 }, "_opacity": 255, "_color": { @@ -312,7 +241,7 @@ "ctor": "Float64Array", "array": [ -379.577, - 100.5, + 90.576, 0, 0, 0, @@ -341,7 +270,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 6 + "__id__": 5 }, "_enabled": true, "_materials": [ @@ -375,7 +304,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 6 + "__id__": 5 }, "_enabled": true, "_normalMaterial": null, @@ -384,7 +313,7 @@ "zoomScale": 1.2, "clickEvents": [ { - "__id__": 9 + "__id__": 8 } ], "_N$interactable": true, @@ -440,7 +369,7 @@ "hoverSprite": null, "_N$disabledSprite": null, "_N$target": { - "__id__": 6 + "__id__": 5 }, "_id": "" }, @@ -459,7 +388,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 6 + "__id__": 5 }, "_enabled": true, "alignMode": 1, @@ -489,15 +418,86 @@ "asset": { "__uuid__": "dc804c5c-ff76-445e-ac69-52269055c3c5" }, - "fileId": "1cUg34ZtdK9JfdGIG+lpdF", + "fileId": "3cdlb7LxhMzLDzxdQv8Z/x", "sync": false }, + { + "__type__": "cc.Node", + "_name": "VerticalLayout", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 12 + } + ], + "_active": true, + "_components": [ + { + "__id__": 53 + }, + { + "__id__": 54 + } + ], + "_prefab": { + "__id__": 55 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 960, + "height": 137 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -68.939, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, { "__type__": "cc.Node", "_name": "HorizontalLayout", "_objFlags": 0, "_parent": { - "__id__": 5 + "__id__": 11 }, "_children": [ { @@ -545,7 +545,7 @@ "ctor": "Float64Array", "array": [ 0, - -64, + 0, 0, 0, 0, @@ -1953,7 +1953,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 5 + "__id__": 11 }, "_enabled": true, "_materials": [ @@ -1983,13 +1983,13 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 5 + "__id__": 11 }, "_enabled": true, "_layoutSize": { "__type__": "cc.Size", "width": 960, - "height": 265 + "height": 137 }, "_resize": 1, "_N$layoutType": 2, @@ -2040,7 +2040,7 @@ "__id__": 43 }, "exitBtnNode": { - "__id__": 6 + "__id__": 5 }, "_id": "" }, diff --git a/frontend/assets/scenes/default_map.fire b/frontend/assets/scenes/default_map.fire index 8b4f763..8d491ac 100644 --- a/frontend/assets/scenes/default_map.fire +++ b/frontend/assets/scenes/default_map.fire @@ -536,7 +536,7 @@ "array": [ 0, 0, - 216.65450766436658, + 216.05530045313827, 0, 0, 0, diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index a3fe1b3..6327572 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 209.66956379694378, + 209.7452601621179, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index 4da4300..dae7dc3 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -518,7 +518,7 @@ "array": [ 0, 0, - 216.50635094610968, + 216.05530045313827, 0, 0, 0, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 226c95a..fb6663c 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -293,7 +293,7 @@ cc.Class({ } }, - popupSimplePressToGo(labelString, hideYesButton) { + popupSimplePressToGo(labelString, hideYesButton, additionalOnDismissalCb) { const self = this; self.state = ALL_MAP_STATES.SHOWING_MODAL_POPUP; @@ -306,6 +306,9 @@ cc.Class({ const postDismissalByYes = () => { self.transitToState(ALL_MAP_STATES.VISUAL); canvasNode.removeChild(simplePressToGoDialogNode); + if (additionalOnDismissalCb) { + additionalOnDismissalCb(); + } } simplePressToGoDialogNode.getChildByName("Hint").getComponent(cc.Label).string = labelString; yesButton.once("click", simplePressToGoDialogScriptIns.dismissDialog.bind(simplePressToGoDialogScriptIns, postDismissalByYes)); diff --git a/frontend/assets/scripts/WsSessionMgr.js b/frontend/assets/scripts/WsSessionMgr.js index e302af4..f371df3 100644 --- a/frontend/assets/scripts/WsSessionMgr.js +++ b/frontend/assets/scripts/WsSessionMgr.js @@ -288,13 +288,21 @@ window.initPersistentSessionClient = function(onopenCb, expectedRoomId) { `); } break; + case constants.RET_CODE.SAME_PLAYER_ALREADY_IN_SAME_ROOM: + mapIns.popupSimplePressToGo("You just logged into a conflicting account, please use a different account to retry", false, () => { + window.clearLocalStorageAndBackToLoginScene(true); + }); + break; case constants.RET_CODE.PLAYER_NOT_ADDABLE_TO_ROOM: case constants.RET_CODE.PLAYER_NOT_READDABLE_TO_ROOM: - window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); // To favor the player to join other rooms - mapIns.onManualRejoinRequired("Couldn't join any room at the moment, please retry"); + mapIns.popupSimplePressToGo("Couldn't join any room at the moment, please retry", false, () => { + window.clearLocalStorageAndBackToLoginScene(true); + }); break; case constants.RET_CODE.ACTIVE_WATCHDOG: - mapIns.onManualRejoinRequired("Disconnected due to long-time inactivity, please rejoin"); + mapIns.popupSimplePressToGo("Couldn't join any room at the moment, please retry", false, () => { + window.clearLocalStorageAndBackToLoginScene(true); + }); break; case constants.RET_CODE.UNKNOWN_ERROR: case constants.RET_CODE.MYSQL_ERROR: @@ -305,7 +313,9 @@ window.initPersistentSessionClient = function(onopenCb, expectedRoomId) { console.warn(`${mapIns._stringifyRdfIdToActuallyUsedInput()} `); } - window.clearLocalStorageAndBackToLoginScene(true); + mapIns.popupSimplePressToGo("Disconnected unexpectedly, please retry", false, () => { + window.clearLocalStorageAndBackToLoginScene(true); + }); break; default: break;