Ent saving and loading
Some checks failed
Build Dusk / build-linux (push) Failing after 49s
Build Dusk / build-psp (push) Failing after 59s

This commit is contained in:
2025-11-22 11:20:07 -06:00
parent 6f33522c1c
commit 03218ce20f
4 changed files with 89 additions and 18 deletions

View File

@@ -22,9 +22,6 @@ class Chunk:
self.tiles = {}
self.vertexBuffer = VertexBuffer()
# TEST
self.addEntity()
tileIndex = 0
for tz in range(CHUNK_DEPTH):
for ty in range(CHUNK_HEIGHT):
@@ -56,10 +53,19 @@ class Chunk:
# For each tile.
for tile in self.tiles.values():
tile.load(data)
# For each entity.
self.entities = {}
if 'entities' in data:
for id, entData in enumerate(data['entities']):
ent = Entity(self)
ent.load(entData)
self.entities[id] = ent
self.tileUpdateVertices()
self.dirty = False
self.onChunkData.invoke(self)
self.map.onEntityData.invoke()
except Exception as e:
raise RuntimeError(f"Failed to load chunk file: {e}")
@@ -68,11 +74,17 @@ class Chunk:
return
dataOut = {
'shapes': []
'shapes': [],
'entities': []
}
for tile in self.tiles.values():
dataOut['shapes'].append(tile.shape)
for ent in self.entities.values():
entData = {}
ent.save(entData)
dataOut['entities'].append(entData)
fname = self.getFilename()
if not fname:
@@ -107,10 +119,11 @@ class Chunk:
def draw(self):
self.vertexBuffer.draw()
def addEntity(self):
ent = Entity()
def addEntity(self, localX=0, localY=0, localZ=0):
ent = Entity(self, localX, localY, localZ)
self.entities[len(self.entities)] = ent
self.map.onEntityData.invoke()
self.dirty = True
return ent
def removeEntity(self, entity):
@@ -118,5 +131,6 @@ class Chunk:
if val == entity:
del self.entities[key]
self.map.onEntityData.invoke()
self.dirty = True
return True
return False

View File

@@ -1,9 +1,25 @@
from dusk.defs import ENTITY_TYPE_NULL, ENTITY_TYPE_NPC
class Entity:
def __init__(self):
def __init__(self, chunk, localX=0, localY=0, localZ=0):
self.type = ENTITY_TYPE_NPC
self.localX = 0
self.localY = 8
self.localZ = 1
self.name = "Unititled"
self.localX = localX
self.localY = localY
self.localZ = localZ
self.chunk = chunk
pass
def load(self, obj):
self.type = obj.get('type', ENTITY_TYPE_NULL)
self.localX = obj.get('x', 0)
self.localY = obj.get('y', 0)
self.localZ = obj.get('z', 0)
pass
def save(self, obj):
obj['type'] = self.type
obj['x'] = self.localX
obj['y'] = self.localY
obj['z'] = self.localZ
pass

View File

@@ -1,6 +1,7 @@
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QListWidget, QHBoxLayout, QPushButton, QLineEdit
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QListWidget, QHBoxLayout, QPushButton, QLineEdit, QListWidgetItem
from PyQt5.QtCore import Qt
from dusk.entity import Entity
from dusk.defs import CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH
class EntityPanel(QWidget):
def __init__(self, parent):
@@ -23,7 +24,7 @@ class EntityPanel(QWidget):
# Entity list and buttons
self.entityList = QListWidget()
self.entityList.addItems(["Entity 1", "Entity 2", "Entity 3"])
self.entityList.addItems([])
layout.addWidget(self.entityList, stretch=1)
btnLayout = QHBoxLayout()
@@ -37,6 +38,7 @@ class EntityPanel(QWidget):
self.btnAdd.clicked.connect(self.onAddEntity)
self.btnRemove.clicked.connect(self.onRemoveEntity)
self.parent.map.onEntityData.sub(self.onEntityData)
self.parent.map.onPositionChange.sub(self.onPositionChange)
self.entityList.itemClicked.connect(self.onEntityClicked)
self.entityList.itemDoubleClicked.connect(self.onEntityDoubleClicked)
@@ -46,18 +48,32 @@ class EntityPanel(QWidget):
def onEntityUnselect(self):
self.nameInput.setText("")
self.entityList.setCurrentItem(None)
def onEntitySelect(self, entity):
self.nameInput.setText(entity.name)
self.entityList.setCurrentItem(entity.item)
def onEntityDoubleClicked(self, item):
print(f"Double clicked: {item.text()}")
entity = item.data(Qt.UserRole)
chunk = entity.chunk
worldX = chunk.x + entity.localX
worldY = chunk.y + entity.localY
worldZ = chunk.z + entity.localZ
self.parent.map.moveTo(worldX, worldY, worldZ)
def onEntityClicked(self, item):
print(f"Clicked: {item.text()}")
pass
def onAddEntity(self):
chunk = self.parent.map.getChunkAtWorldPos(*self.parent.map.position)
if chunk is None:
return
chunk.addEntity()
ent = chunk.addEntity(
self.parent.map.position[0] - chunk.x,
self.parent.map.position[1] - chunk.y,
self.parent.map.position[2] - chunk.z
)
def onRemoveEntity(self):
pass
@@ -66,5 +82,30 @@ class EntityPanel(QWidget):
self.onEntityUnselect()
self.entityList.clear()
for chunk in self.parent.map.chunks.values():
for entity_id, entity in chunk.entities.items():
self.entityList.addItem(f"Entity {entity_id}")
for id, entity in chunk.entities.items():
item = QListWidgetItem(entity.name)
item.setData(Qt.UserRole, entity) # Store the entity object
entity.item = item
self.entityList.addItem(item)
# Select if there is something at current position
self.onPositionChange(self.parent.map.position)
def onPositionChange(self, position):
self.onEntityUnselect()
# Get Entity at..
chunk = self.parent.map.getChunkAtWorldPos(*position)
if chunk is None:
return
localX = position[0] - chunk.x
localY = position[1] - chunk.y
localZ = position[2] - chunk.z
for ent in chunk.entities.values():
if ent.localX != localX or ent.localY != localY or ent.localZ != localZ:
continue
self.onEntitySelect(ent)
self.entityList.setCurrentItem(ent.item)
break