Skip to content

Commit 2f10b1d

Browse files
committed
Add first (bad) code
1 parent 5ad6962 commit 2f10b1d

File tree

9 files changed

+750
-1
lines changed

9 files changed

+750
-1
lines changed

.gitignore

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,88 @@ cython_debug/
165165
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
166166
# and can be added to the global gitignore or merged into this file. For a more nuclear
167167
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
168-
#.idea/
168+
.idea/
169169

170170
# Ruff stuff:
171171
.ruff_cache/
172172

173173
# PyPI configuration file
174174
.pypirc
175+
176+
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
177+
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
178+
179+
# User-specific stuff
180+
.idea/**/workspace.xml
181+
.idea/**/tasks.xml
182+
.idea/**/usage.statistics.xml
183+
.idea/**/dictionaries
184+
.idea/**/shelf
185+
186+
# AWS User-specific
187+
.idea/**/aws.xml
188+
189+
# Generated files
190+
.idea/**/contentModel.xml
191+
192+
# Sensitive or high-churn files
193+
.idea/**/dataSources/
194+
.idea/**/dataSources.ids
195+
.idea/**/dataSources.local.xml
196+
.idea/**/sqlDataSources.xml
197+
.idea/**/dynamic.xml
198+
.idea/**/uiDesigner.xml
199+
.idea/**/dbnavigator.xml
200+
201+
# Gradle
202+
.idea/**/gradle.xml
203+
.idea/**/libraries
204+
205+
# Gradle and Maven with auto-import
206+
# When using Gradle or Maven with auto-import, you should exclude module files,
207+
# since they will be recreated, and may cause churn. Uncomment if using
208+
# auto-import.
209+
# .idea/artifacts
210+
# .idea/compiler.xml
211+
# .idea/jarRepositories.xml
212+
# .idea/modules.xml
213+
# .idea/*.iml
214+
# .idea/modules
215+
# *.iml
216+
# *.ipr
217+
218+
# CMake
219+
cmake-build-*/
220+
221+
# Mongo Explorer plugin
222+
.idea/**/mongoSettings.xml
223+
224+
# File-based project format
225+
*.iws
226+
227+
# IntelliJ
228+
out/
229+
230+
# mpeltonen/sbt-idea plugin
231+
.idea_modules/
232+
233+
# JIRA plugin
234+
atlassian-ide-plugin.xml
235+
236+
# Cursive Clojure plugin
237+
.idea/replstate.xml
238+
239+
# SonarLint plugin
240+
.idea/sonarlint/
241+
242+
# Crashlytics plugin (for Android Studio and IntelliJ)
243+
com_crashlytics_export_strings.xml
244+
crashlytics.properties
245+
crashlytics-build.properties
246+
fabric.properties
247+
248+
# Editor-based Rest Client
249+
.idea/httpRequests
250+
251+
# Android studio 3.1+ serialized cache file
252+
.idea/caches/build_file_checksums.ser

README.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,62 @@
11
# Datapack Toolkit
2+
An easy worldgen datapack configuration tool made in a weekend.
3+
4+
Currently supports biome definition ordering/removal.
5+
That means you can pick and choose which biome overhaul you want, from whichever datapacks you want.
6+
7+
The result are modified datapacks ready to be used.
8+
9+
## Using Datapack Toolkit
10+
Simply download the latest version and run the app!
11+
No installation is necessary.
12+
13+
Load your datapack(s) by clicking ***Import datapack*** in the top left.
14+
Export modified versions by clicking ***Export datapack(s)***.
15+
16+
## Working on Datapack Toolkit
17+
18+
### Prerequisites
19+
Datapack Toolkit is built in Python and Qt.
20+
21+
After picking the right IDE, make sure you have Python **3.12** installed.
22+
23+
Create a virtual environment (ideally). Your IDE should take care of this. [Or if not...](https://doc.qt.io/qtforpython-6/gettingstarted.html#installation)
24+
25+
You only need **PySide6** to work on the app:
26+
27+
pip install pyside6
28+
29+
That's all. Have fun reating my spaghetti :3
30+
31+
I should note that on the off-chance anybody _will_ try to work on the code,
32+
the current datapack and biome management class `biomeblender` will later be removed in favour of multiple, more flexible options.
33+
See `datapackmanager`.
34+
35+
### Packaging
36+
37+
Datapack Toolkit is packaged using PyInstaller.
38+
It has [requirements](https://pyinstaller.org/en/stable/requirements.html).
39+
If you're good to go, run:
40+
41+
pip install pyinstaller
42+
43+
Package the app in your terminal. Make sure you're in the project directory and run the following command to package the app:
44+
45+
pyinstaller --onefile --noconsole --icon "src/assets/app.ico" --name "dptoolkit" "src/main.py"
46+
47+
Include the assets folder with the app for the icon to work properly.
48+
(I know there's a command.. I'll get around to streamlining this later... For now this is fine...)
49+
50+
## Plans for Datapack Toolkit
51+
52+
There is currently one feature _definitely_ planned to be implemented (by me):
53+
- Structure generation configuration
54+
- I.e. spacing and separation
55+
56+
There are other thins I would like to do:
57+
- Biome removal/replacement (such as for _Terralith_ or _Alpine_)
58+
- Noise/density function scale adjustment (such as for _Continents_)
59+
60+
Internally, datapack and biome management will later be completely separated, but y'know. Spaghetti for now... mhmm.. i wan spaghetti now...
61+
262
![](https://raw.githubusercontent.com/everloste/DatapackToolkit/refs/heads/main/code.png)

requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
PySide6~=6.9.0
2+
pyinstaller~=6.12.0

src/assets/app.ico

50.1 KB
Binary file not shown.

src/main.py

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
import sys
2+
from modules import Dialogs, biomeblender, InfoWindow
3+
from PySide6 import QtCore, QtWidgets, QtGui
4+
5+
6+
class MainWindow(QtWidgets.QMainWindow):
7+
def __init__(self, master):
8+
super().__init__()
9+
self.master = master
10+
self.menu = self.menuBar()
11+
12+
file_menu = self.menu.addMenu("Datapack")
13+
import_action = file_menu.addAction("Import datapack")
14+
import_action.triggered.connect(self.import_datapacks)
15+
export_action = file_menu.addAction("Export datapack(s)")
16+
export_action.triggered.connect(self.export_datapacks)
17+
18+
about_menu = self.menu.addMenu("About")
19+
about_action = about_menu.addAction("About Datapack Toolkit")
20+
about_action.triggered.connect(self.show_about_window)
21+
22+
self.widget = MainWidget()
23+
self.setCentralWidget(self.widget)
24+
self.biome_manager = self.widget.biome_manager
25+
26+
27+
@QtCore.Slot()
28+
def import_datapacks(self):
29+
file = QtWidgets.QFileDialog.getOpenFileName(self, "Select datapack", "", "Datapack files (*.zip *.jar)")
30+
location = file[0]
31+
self.biome_manager.add_pack(location)
32+
33+
self.widget.biome_list_widget.update_list()
34+
self.widget.biome_list_scroll_area.update()
35+
self.widget.datapack_list_widget.update_list()
36+
37+
38+
@QtCore.Slot()
39+
def export_datapacks(self):
40+
dlg = Dialogs.ConfirmExportDialog()
41+
if dlg.exec():
42+
if self.biome_manager.export_datapacks() is not None:
43+
msgBox = QtWidgets.QMessageBox()
44+
msgBox.setText("Success :3")
45+
msgBox.exec()
46+
47+
48+
@QtCore.Slot()
49+
def show_about_window(self):
50+
new_window = InfoWindow.AboutWidget()
51+
new_window.exec()
52+
53+
54+
class MainWidget(QtWidgets.QWidget):
55+
def __init__(self):
56+
super().__init__()
57+
58+
self.biome_manager = biomeblender.BiomeBlender([])
59+
60+
self.datapack_list_widget = DatapackListWidget(self, self.biome_manager)
61+
self.biome_list_widget = BiomeListWidget(self.biome_manager)
62+
63+
# Layout time!!!!!!!!!!
64+
self.layout = QtWidgets.QHBoxLayout(self)
65+
self.layout.addWidget(self.datapack_list_widget)
66+
self.biome_list_scroll_area = QtWidgets.QScrollArea()
67+
self.biome_list_scroll_area.setWidget(self.biome_list_widget)
68+
self.biome_list_scroll_area.setWidgetResizable(True)
69+
self.layout.addWidget(self.biome_list_scroll_area)
70+
71+
72+
class DatapackListWidget(QtWidgets.QListWidget):
73+
74+
def __init__(self, master, controller: biomeblender.BiomeBlender):
75+
super().__init__()
76+
self.master = master
77+
self.controller = controller
78+
self.entries = list()
79+
self.layout = QtWidgets.QVBoxLayout(self)
80+
81+
self.setFixedWidth(250)
82+
83+
self.update_list()
84+
85+
86+
def update_list(self):
87+
if hasattr(self, 'entries'):
88+
for entry in self.entries:
89+
self.layout.removeWidget(entry)
90+
entry.deleteLater()
91+
92+
self.entries.clear()
93+
94+
for pack in self.controller.packs:
95+
entry = self.ItemWidget(self, pack["id"])
96+
self.entries.append(entry)
97+
self.layout.addWidget(entry)
98+
99+
100+
class ItemWidget(QtWidgets.QFrame):
101+
102+
def __init__(self, master, pack_id):
103+
super().__init__()
104+
self.packID = pack_id
105+
self.master = master
106+
self.layout = QtWidgets.QVBoxLayout(self)
107+
108+
self.setLineWidth(1); self.setFrameShape(QtWidgets.QFrame.Shape.Box)
109+
self.setFixedHeight(150)
110+
111+
self.text = QtWidgets.QLabel(self.packID, alignment=QtCore.Qt.AlignmentFlag.AlignCenter); self.text.setMaximumHeight(75); self.text.setWordWrap(True)
112+
self.removal_button = QtWidgets.QPushButton(); self.removal_button.setText("Remove"); self.removal_button.clicked.connect(self._remove_)
113+
self.move_up_button = QtWidgets.QPushButton(); self.move_up_button.setText("Move up"); self.move_up_button.clicked.connect(self._move_up_)
114+
115+
desc = self.master.controller.get_pack_info(self.packID)["mcmeta"]["pack"]["description"]
116+
if isinstance(desc, list):
117+
string = str()
118+
for entry in desc:
119+
string += entry["text"]
120+
desc = string
121+
122+
self.desc = QtWidgets.QLabel(desc, alignment=QtCore.Qt.AlignmentFlag.AlignCenter)
123+
124+
self.layout.addWidget(self.text)
125+
self.layout.addWidget(self.desc)
126+
self.layout.addWidget(self.move_up_button)
127+
self.layout.addWidget(self.removal_button)
128+
129+
130+
def _move_up_(self):
131+
self.master.controller.move_pack_up(self.packID)
132+
self.master.update_list()
133+
self.master.master.biome_list_widget.update_list()
134+
135+
136+
def _remove_(self):
137+
self.master.controller.remove_pack(self.packID)
138+
self.master.update_list()
139+
self.master.master.biome_list_widget.update_list() # :)
140+
141+
142+
class BiomeListWidget(QtWidgets.QWidget):
143+
144+
def __init__(self, controller: biomeblender.BiomeBlender):
145+
super().__init__()
146+
self.controller = controller
147+
self.entries = list()
148+
self.layout = QtWidgets.QVBoxLayout(self)
149+
150+
self.update_list()
151+
152+
153+
def update_list(self):
154+
print("Updating biome list widget...")
155+
156+
for entry in self.entries:
157+
self.layout.removeWidget(entry)
158+
entry.deleteLater()
159+
160+
self.entries.clear()
161+
162+
for biome in self.controller.list_all_biomes():
163+
entry = self.ItemWidget(self, biome)
164+
self.entries.append(entry)
165+
self.layout.addWidget(entry)
166+
167+
self.update()
168+
169+
170+
class ItemWidget(QtWidgets.QWidget):
171+
172+
def __init__(self, master, biome):
173+
super().__init__()
174+
self.master = master
175+
self.biomeID = biome
176+
177+
# Biome label time!!!!!!
178+
self.text = QtWidgets.QLabel(self.biomeID)
179+
self.text.setFixedWidth(200)
180+
self.text.setMaximumHeight(75)
181+
self.text.setWordWrap(True)
182+
183+
# Dropdown button for options!!!!!!!
184+
self.options_button = QtWidgets.QComboBox()
185+
self.options_button.setFixedWidth(200)
186+
self.options_button.addItems(self.master.controller.get_packs_with_biome(self.biomeID))
187+
if "minecraft:" in self.biomeID:
188+
self.options_button.addItem("Vanilla")
189+
190+
if self.master.controller.get_biome_info(self.biomeID)["changed"]:
191+
if self.master.controller.get_biome_preference(self.biomeID) is None:
192+
self.options_button.setCurrentText("Vanilla")
193+
else:
194+
self.options_button.setCurrentText(self.master.controller.get_biome_preference(self.biomeID))
195+
196+
self.options_button.currentTextChanged.connect(self._activated_event_)
197+
198+
# Layout time!!!!
199+
self.layout = QtWidgets.QHBoxLayout(self)
200+
self.layout.addWidget(self.text)
201+
self.layout.addWidget(self.options_button)
202+
203+
204+
@QtCore.Slot()
205+
def _activated_event_(self, selection: str):
206+
if selection.lower() != "vanilla":
207+
self.master.controller.set_biome_preference(self.biomeID, selection)
208+
else:
209+
self.master.controller.set_biome_preference(self.biomeID, None)
210+
211+
212+
if __name__ == "__main__":
213+
app = QtWidgets.QApplication([])
214+
app.setApplicationName("Datapack Toolkit")
215+
app.setDesktopSettingsAware(True)
216+
app.setStyle("fusion")
217+
218+
icon = QtGui.QPixmap()
219+
icon.load(f"assets/app.ico")
220+
app.setWindowIcon(icon)
221+
222+
window = MainWindow(app)
223+
window.resize(800, 600)
224+
window.show()
225+
226+
sys.exit(app.exec())

0 commit comments

Comments
 (0)