From cbd35c16054cde1d40fd90aa27075921bdb84f52 Mon Sep 17 00:00:00 2001 From: David Vierra Date: Wed, 13 May 2015 22:33:08 -1000 Subject: [PATCH] Use catchalls to skip over errors while centering views on players Avoids crashes on badly-formed player data. Should tighten this up to only catch errors in getting the player's position. Should also add a validate function to AnvilPlayerRef (and every other ref, too?) --- src/mcedit2/editorsession.py | 55 +++++++++++++++++++----------------- src/mcedit2/worldlist.py | 32 ++++++++++++--------- 2 files changed, 47 insertions(+), 40 deletions(-) diff --git a/src/mcedit2/editorsession.py b/src/mcedit2/editorsession.py index dd978c8..8ec7837 100644 --- a/src/mcedit2/editorsession.py +++ b/src/mcedit2/editorsession.py @@ -507,17 +507,17 @@ class EditorSession(QtCore.QObject): def findReplace(self): self.findReplaceDialog.exec_() - + def analyze(self): if self.currentSelection is None: return task = self.currentDimension.analyzeIter(self.currentSelection) showProgress("Analyzing...", task) - outputDialog = AnalyzeOutputDialog(self, task.blocks, - task.entityCounts, + outputDialog = AnalyzeOutputDialog(self, task.blocks, + task.entityCounts, task.tileEntityCounts, task.dimension.worldEditor.displayName) - + def deleteSelection(self): command = SimpleRevisionCommand(self, "Delete") with command.begin(): @@ -673,31 +673,34 @@ class EditorSession(QtCore.QObject): # --- Misplaced startup code? --- def loadDone(self): - # Called by MCEditApp after the view is on screen to make sure view.center() works correctly xxx used depth - # buffer read for that, now what? + # Called by MCEditApp after the view is on screen to make sure view.center() works correctly + # xxx used depthbuffer read for that, now what? try: - player = self.worldEditor.getPlayer() - center = Vector(*player.Position) + (0, 1.8, 0) - dimNo = player.Dimension - dimName = self.worldEditor.dimNameFromNumber(dimNo) - log.info("Setting view angle to single-player player's view in dimension %s.", dimName) - rotation = player.Rotation - if dimName: - self.gotoDimension(dimName) try: - self.editorTab.currentView().yawPitch = rotation - except AttributeError: - pass - except PlayerNotFound: - try: - center = self.worldEditor.worldSpawnPosition() - log.info("Centering on spawn position.") - except AttributeError: - log.info("Centering on world center") - center = self.currentDimension.bounds.origin + (self.currentDimension.bounds.size * 0.5) + player = self.worldEditor.getPlayer() + center = Vector(*player.Position) + (0, 1.8, 0) + dimNo = player.Dimension + dimName = self.worldEditor.dimNameFromNumber(dimNo) + log.info("Setting view angle to single-player player's view in dimension %s.", dimName) + rotation = player.Rotation + if dimName: + self.gotoDimension(dimName) + try: + self.editorTab.currentView().yawPitch = rotation + except AttributeError: + pass + except PlayerNotFound: + try: + center = self.worldEditor.worldSpawnPosition() + log.info("Centering on spawn position.") + except AttributeError: + log.info("Centering on world center") + center = self.currentDimension.bounds.origin + (self.currentDimension.bounds.size * 0.5) + self.editorTab.miniMap.centerOnPoint(center) + self.editorTab.currentView().centerOnPoint(center, distance=0) + except Exception as e: + log.exception("Error while centering on player for world editor: %s", e) - self.editorTab.miniMap.centerOnPoint(center) - self.editorTab.currentView().centerOnPoint(center, distance=0) # --- Tools --- diff --git a/src/mcedit2/worldlist.py b/src/mcedit2/worldlist.py index cbadeb2..6054d5d 100644 --- a/src/mcedit2/worldlist.py +++ b/src/mcedit2/worldlist.py @@ -379,23 +379,27 @@ class WorldListWidget(QtGui.QDialog): self.chunkLoader.chunkCompleted.connect(self.worldView.update) try: - player = worldEditor.getPlayer() - log.info("Centering on single-player player.") - except PlayerNotFound: try: - center = worldEditor.worldSpawnPosition() - log.info("Centering on spawn position.") - except AttributeError: - log.info("Centering on world center") - center = dim.bounds.origin + (dim.bounds.size * 0.5) - else: - if player.dimName == dim.dimName: - center = Vector(*player.Position) - self.worldView.centerOnPoint(center) + player = worldEditor.getPlayer() + log.info("Centering on single-player player.") + except PlayerNotFound: + try: + center = worldEditor.worldSpawnPosition() + log.info("Centering on spawn position.") + except AttributeError: + log.info("Centering on world center") + center = dim.bounds.origin + (dim.bounds.size * 0.5) else: - center = dim.bounds.origin + (dim.bounds.size * 0.5) + if player.dimName == dim.dimName: + center = Vector(*player.Position) + self.worldView.centerOnPoint(center) + else: + center = dim.bounds.origin + (dim.bounds.size * 0.5) + + self.worldView.centerOnPoint(center) + except Exception as e: + log.exception("Error while centering view in world list: %s", e) - self.worldView.centerOnPoint(center) log.info("Switched world view") def setWorldView(self, worldView):