Non-NBT chunk editor (is this really necessary)

This commit is contained in:
David Vierra 2015-01-08 15:41:41 -10:00
parent a206ab5336
commit 993d348bfe
4 changed files with 209 additions and 8 deletions

View File

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

View File

@ -15,9 +15,6 @@ log = logging.getLogger(__name__)
class PlayerPanel(QtGui.QWidget):
name = "Edit Player"
iconName = "edit_player"
def __init__(self, editorSession, *args, **kwargs):
"""

View File

@ -32,7 +32,10 @@
<enum>QAbstractSpinBox::UpDownArrows</enum>
</property>
<property name="minimum">
<number>-9000000</number>
<number>-900000000</number>
</property>
<property name="maximum">
<number>900000000</number>
</property>
<property name="value">
<number>0</number>
@ -49,10 +52,10 @@
<item>
<widget class="QSpinBox" name="czSpinBox">
<property name="minimum">
<number>-9000000</number>
<number>-90000000</number>
</property>
<property name="maximum">
<number>9000000</number>
<number>90000000</number>
</property>
</widget>
</item>
@ -67,6 +70,122 @@
<attribute name="title">
<string>Chunk</string>
</attribute>
<widget class="QWidget" name="">
<property name="geometry">
<rect>
<x>14</x>
<y>20</y>
<width>162</width>
<height>98</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QCheckBox" name="terrainPopulatedInput">
<property name="toolTip">
<string>Marks this chunk to have trees, lakes, ores, and other terrain features regenerated in Minecraft.</string>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Terrain Populated</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="lightPopulatedInput">
<property name="toolTip">
<string>Currently does nothing. Minecraft sets it after generating a chunk but never reads it again.</string>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Light Populated</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>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.</string>
</property>
<property name="text">
<string>Update Time</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="updateTimeInput">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>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.</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>2000000000</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Number of ticks the player has spent in this chunk.</string>
</property>
<property name="text">
<string>Inhabited Time</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="inhabitedTimeInput">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Number of ticks the player has spent in this chunk.</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>2000000000</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<widget class="NBTTreeView" name="nbtTreeView">
<attribute name="title">

View File

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