diff --git a/src/mcedit2/editortools/edit_chunk.py b/src/mcedit2/editortools/edit_chunk.py index 3ce577d..3d63664 100644 --- a/src/mcedit2/editortools/edit_chunk.py +++ b/src/mcedit2/editortools/edit_chunk.py @@ -5,7 +5,9 @@ from __future__ import absolute_import, division, print_function, unicode_litera import logging from PySide.QtCore import Qt from mcedit2.editortools import EditorTool +from mcedit2.editortools.select import SelectionBoxNode from mcedit2.nbt_treemodel import NBTTreeModel, NBTFilterProxyModel +from mcedit2.rendering import scenegraph from mcedit2.util.load_ui import load_ui log = logging.getLogger(__name__) @@ -22,20 +24,100 @@ class ChunkTool(EditorTool): super(ChunkTool, self).__init__(editorSession, *args, **kwargs) self.toolWidget = load_ui("editortools/edit_chunk.ui") + self.toolWidget.tabWidget.currentChanged.connect(self.tabDidChange) + + self.toolWidget.terrainPopulatedInput.toggled.connect(self.terrainPopulatedDidChange) + self.toolWidget.lightPopulatedInput.toggled.connect(self.lightPopulatedDidChange) + self.toolWidget.inhabitedTimeInput.valueChanged.connect(self.inhabitedTimeDidChange) + self.toolWidget.updateTimeInput.valueChanged.connect(self.updateTimeDidChange) + + self.toolWidget.cxSpinBox.valueChanged.connect(self.chunkPositionDidChange) + self.toolWidget.czSpinBox.valueChanged.connect(self.chunkPositionDidChange) + self.currentChunk = None + self.selectionNode = None + self.overlayNode = scenegraph.Node() + self.updateChunkWidget() + + def toolInactive(self): + self.overlayNode.removeChild(self.selectionNode) + self.selectionNode = None + self.currentChunk = None + self.updateChunkWidget() + + + def updateChunkWidget(self): + if self.currentChunk: + chunk = self.currentChunk + + self.toolWidget.terrainPopulatedInput.setEnabled(True) + self.toolWidget.terrainPopulatedInput.setChecked(chunk.TerrainPopulated) + + levelTag = chunk.rootTag["Level"] + if "LightPopulated" in levelTag: + self.toolWidget.lightPopulatedInput.setEnabled(True) + self.toolWidget.lightPopulatedInput.setChecked(levelTag["LightPopulated"].value) + else: + self.toolWidget.lightPopulatedInput.setEnabled(False) + + if "InhabitedTime" in levelTag: + self.toolWidget.inhabitedTimeInput.setEnabled(True) + self.toolWidget.inhabitedTimeInput.setValue(levelTag["InhabitedTime"].value) + else: + self.toolWidget.inhabitedTimeInput.setEnabled(False) + + if "LastUpdate" in levelTag: + self.toolWidget.updateTimeInput.setEnabled(True) + self.toolWidget.updateTimeInput.setValue(levelTag["LastUpdate"].value) + else: + self.toolWidget.updateTimeInput.setEnabled(False) + else: + self.toolWidget.terrainPopulatedInput.setEnabled(False) + self.toolWidget.lightPopulatedInput.setEnabled(False) + self.toolWidget.inhabitedTimeInput.setEnabled(False) + self.toolWidget.updateTimeInput.setEnabled(False) + + + def terrainPopulatedDidChange(self, value): + self.currentChunk.TerrainPopulated = value + + def lightPopulatedDidChange(self, value): + self.currentChunk.rootTag["Level"]["LightPopulated"].value = value + + def inhabitedTimeDidChange(self, value): + self.currentChunk.rootTag["Level"]["InhabitedTime"].value = value + + def updateTimeDidChange(self, value): + self.currentChunk.rootTag["Level"]["LastUpdate"].value = value + + def tabDidChange(self, index): + if index == 0: # Chunk tab + self.updateChunkWidget() + else: # NBT tab + pass def mousePress(self, event): x, y, z = event.blockPosition cx = x >> 4 cz = z >> 4 + self.selectChunk(cx, cz) + + def selectChunk(self, cx, cz): dim = self.editorSession.currentDimension if dim.containsChunk(cx, cz): chunk = dim.getChunk(cx, cz) self.setSelectedChunk(chunk) def setSelectedChunk(self, chunk): - self.currentChunk = chunk + if self.selectionNode is None: + self.selectionNode = SelectionBoxNode() + self.selectionNode.filled = False + self.selectionNode.color = (0.3, 0.3, 1) + self.overlayNode.addChild(self.selectionNode) + self.selectionNode.selectionBox = chunk.bounds + self.currentChunk = chunk + self.updateChunkWidget() model = NBTTreeModel(chunk.rootTag) self.toolWidget.nbtTreeView.setModel(model) @@ -43,3 +125,7 @@ class ChunkTool(EditorTool): self.toolWidget.cxSpinBox.setValue(chunk.cx) self.toolWidget.czSpinBox.setValue(chunk.cz) + def chunkPositionDidChange(self): + cx = self.toolWidget.cxSpinBox.value() + cz = self.toolWidget.czSpinBox.value() + self.selectChunk(cx, cz) diff --git a/src/mcedit2/panels/player.py b/src/mcedit2/panels/player.py index 986ecac..70294b0 100644 --- a/src/mcedit2/panels/player.py +++ b/src/mcedit2/panels/player.py @@ -15,9 +15,6 @@ log = logging.getLogger(__name__) class PlayerPanel(QtGui.QWidget): - name = "Edit Player" - iconName = "edit_player" - def __init__(self, editorSession, *args, **kwargs): """ diff --git a/src/mcedit2/ui/editortools/edit_chunk.ui b/src/mcedit2/ui/editortools/edit_chunk.ui index 0d0114d..816328a 100644 --- a/src/mcedit2/ui/editortools/edit_chunk.ui +++ b/src/mcedit2/ui/editortools/edit_chunk.ui @@ -32,7 +32,10 @@ QAbstractSpinBox::UpDownArrows - -9000000 + -900000000 + + + 900000000 0 @@ -49,10 +52,10 @@ - -9000000 + -90000000 - 9000000 + 90000000 @@ -67,6 +70,122 @@ Chunk + + + + 14 + 20 + 162 + 98 + + + + + + + Marks this chunk to have trees, lakes, ores, and other terrain features regenerated in Minecraft. + + + Qt::RightToLeft + + + Terrain Populated + + + + + + + Currently does nothing. Minecraft sets it after generating a chunk but never reads it again. + + + Qt::RightToLeft + + + Light Populated + + + + + + + + + + 0 + 0 + + + + Time in ticks when this chunk was last updated. Recently played chunks will reflect the current in-game time, older chunks will have smaller values. + + + Update Time + + + + + + + + 0 + 0 + + + + Time in ticks when this chunk was last updated. Recently played chunks will reflect the current in-game time, older chunks will have smaller values. + + + 0 + + + 2000000000 + + + + + + + + + + + + 0 + 0 + + + + Number of ticks the player has spent in this chunk. + + + Inhabited Time + + + + + + + + 0 + 0 + + + + Number of ticks the player has spent in this chunk. + + + 0 + + + 2000000000 + + + + + + + diff --git a/src/mceditlib/anvil/adapter.py b/src/mceditlib/anvil/adapter.py index 1efe84c..28cb247 100644 --- a/src/mceditlib/anvil/adapter.py +++ b/src/mceditlib/anvil/adapter.py @@ -316,7 +316,6 @@ class AnvilChunkData(object): # z, x order in save file return self.rootTag["Level"]["HeightMap"].value.reshape((16, 16)) - @property def TerrainPopulated(self): return self.rootTag["Level"]["TerrainPopulated"].value