diff --git a/src/mcedit2/editorsession.py b/src/mcedit2/editorsession.py index 295e342..7c14fd8 100644 --- a/src/mcedit2/editorsession.py +++ b/src/mcedit2/editorsession.py @@ -259,6 +259,11 @@ class EditorSession(QtCore.QObject): player = self.worldEditor.getPlayer() center = Vector(*player.Position) log.info("Centering on single-player player.") + rotation = player.Rotation + try: + self.editorTab.currentView().yawPitch = rotation + except AttributeError: + pass except PlayerNotFound: try: center = self.worldEditor.worldSpawnPosition() diff --git a/src/mcedit2/editortools/edit_player.py b/src/mcedit2/editortools/edit_player.py index dc23ea5..685c030 100644 --- a/src/mcedit2/editortools/edit_player.py +++ b/src/mcedit2/editortools/edit_player.py @@ -4,6 +4,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals import logging from PySide.QtCore import Qt +from mcedit2.command import SimpleRevisionCommand from mcedit2.editortools import EditorTool from mcedit2.nbt_treemodel import NBTTreeModel, NBTFilterProxyModel from mcedit2.util.load_ui import load_ui @@ -52,7 +53,16 @@ class PlayerTool(EditorTool): def movePlayerToCamera(self): view = self.editorSession.editorTab.currentView() if view.viewID == "Cam": - self.selectedPlayer.Position = view.centerPoint + command = SimpleRevisionCommand(self.editorSession, "Move Player") + with command.begin(): + self.selectedPlayer.Position = view.centerPoint + try: + self.selectedPlayer.Rotation = view.yawPitch + except AttributeError: + pass + + self.selectedPlayer.dirty = True # xxx do in AnvilPlayerRef + self.editorSession.pushCommand(command) else: raise ValueError("Current view is not camera view.") diff --git a/src/mceditlib/anvil/adapter.py b/src/mceditlib/anvil/adapter.py index f8f75af..76a6b34 100644 --- a/src/mceditlib/anvil/adapter.py +++ b/src/mceditlib/anvil/adapter.py @@ -335,6 +335,7 @@ class AnvilWorldMetadata(object): def __init__(self, metadataTag): self.metadataTag = metadataTag self.rootTag = metadataTag["Data"] + self.dirty = False # --- NBT Tag variables --- @@ -487,7 +488,9 @@ class AnvilWorldAdapter(object): :return: :rtype: """ - self.selectedRevision.writeFile("level.dat", self.metadata.metadataTag.save()) + if self.metadata.dirty: + self.selectedRevision.writeFile("level.dat", self.metadata.metadataTag.save()) + self.metadata.dirty = False def saveChanges(self): """ @@ -801,7 +804,7 @@ class AnvilWorldAdapter(object): def savePlayerTag(self, tag, playerUUID): if playerUUID == "": # sync metadata? - return + self.metadata.dirty = True else: self.selectedRevision.writeFile("playerdata/%s.dat" % playerUUID, tag.save()) @@ -920,6 +923,7 @@ class AnvilPlayerRef(object): def save(self): if self.dirty: self.adapter.savePlayerTag(self.rootTag, self.playerUUID) + self.dirty = False _dimNames = { -1:"DIM-1", diff --git a/src/mceditlib/worldeditor.py b/src/mceditlib/worldeditor.py index 1bd6029..8beed85 100644 --- a/src/mceditlib/worldeditor.py +++ b/src/mceditlib/worldeditor.py @@ -252,8 +252,11 @@ class WorldEditor(object): :return: :rtype: """ + dirtyPlayers = 0 for player in self.playerCache.itervalues(): - player.save() + if player.dirty: + dirtyPlayers += 1 + player.save() dirtyChunkCount = 0 for chunk in self._loadedChunkData.itervalues(): @@ -261,7 +264,8 @@ class WorldEditor(object): dirtyChunkCount += 1 self.adapter.writeChunk(chunk) chunk.dirty = False - log.info(u"Saved {0} chunks".format(dirtyChunkCount)) + self.adapter.syncToDisk() + log.info(u"Saved %d chunks and %d players", dirtyChunkCount, dirtyPlayers) def saveChanges(self): if self.readonly: