Non-NBT chunk editor (is this really necessary)
This commit is contained in:
parent
a206ab5336
commit
993d348bfe
@ -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)
|
||||
|
@ -15,9 +15,6 @@ log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class PlayerPanel(QtGui.QWidget):
|
||||
name = "Edit Player"
|
||||
iconName = "edit_player"
|
||||
|
||||
def __init__(self, editorSession, *args, **kwargs):
|
||||
"""
|
||||
|
||||
|
@ -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">
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user