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?)
This commit is contained in:
David Vierra 2015-05-13 22:33:08 -10:00
parent d10c6440ff
commit cbd35c1605
2 changed files with 47 additions and 40 deletions

View File

@ -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 ---

View File

@ -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):