This commit is contained in:
Team3
2026-09-16 16:15:32 +02:00
parent e813b5f7aa
commit 7c4edaa439
19 changed files with 1244 additions and 636 deletions

View File

@@ -7,10 +7,18 @@ class_name DreamWorld
var spawn := Vector3(0, 2.0, 20.0)
var bewohner: Array = []
var spieler: Node3D = null # setzt main, für den Etagenschnitt
var nav_map: RID # Navigationsnetz über Insel, Wege und Häuser
var _bauten: Array = []
var _lichter: Array = []
var _freihalten: Array[Vector3] = []
var _we: WorldEnvironment
var _env: Environment
## Nur die aktive Welt stellt den Himmel; zwei WorldEnvironments vertragen sich nicht.
func aktiv_setzen(an: bool) -> void:
_we.environment = _env if an else null
func _ready() -> void:
@@ -23,13 +31,39 @@ func _ready() -> void:
_lichtung()
_tor_zur_erde()
_gruen()
_navigation()
_wesen()
## Navigationsnetz aus den Kollisionsformen: Insel, Häuser, Bäume, Laternen.
func _navigation() -> void:
var region := NavigationRegion3D.new()
add_child(region)
var nm := NavigationMesh.new()
nm.geometry_parsed_geometry_type = NavigationMesh.PARSED_GEOMETRY_STATIC_COLLIDERS
nm.agent_radius = 0.4
nm.agent_height = 1.6
nm.agent_max_climb = 0.35
nm.agent_max_slope = 40.0
nm.cell_height = 0.1
var quelle := NavigationMeshSourceGeometryData3D.new()
NavigationServer3D.parse_source_geometry_data(nm, quelle, self)
NavigationServer3D.bake_from_source_geometry_data(nm, quelle)
nav_map = NavigationServer3D.map_create()
NavigationServer3D.map_set_active(nav_map, true)
NavigationServer3D.map_set_cell_height(nav_map, 0.1)
region.set_navigation_map(nav_map)
region.navigation_mesh = nm
NavigationServer3D.map_set_use_async_iterations(nav_map, false)
NavigationServer3D.map_force_update(nav_map)
## Dämmerung: tiefes Blau oben, warmes Lavendel am Horizont, Nebel im Tal.
func _environment() -> void:
var we := WorldEnvironment.new()
var env := Environment.new()
_we = WorldEnvironment.new()
var we := _we
_env = Environment.new()
var env := _env
env.background_mode = Environment.BG_SKY
var sky := Sky.new()
var mat := ProceduralSkyMaterial.new()
@@ -182,7 +216,7 @@ func _wege() -> void:
for k in DreamDB.NETZ.knoten:
var p: Vector3 = k
p.y = DreamDB.hoehe_bei(p.x, p.z)
Prims.cyl(self, p + Vector3(0, 0.04, 0), 1.3, 0.06, farbe, false)
Prims.cyl(self, p + Vector3(0, 0.05, 0), 1.3, 0.06, farbe, false) # knapp über den Bändern
if nr % 2 == 0 and Vector2(p.x, p.z).length() > 12.0:
_laterne(p + Vector3(1.6, 0, 0))
nr += 1
@@ -212,7 +246,7 @@ func _haeuser() -> void:
Orte.DIR_VEC[pl["dir"]], 3.4, true)
var dach := Prims.dach(self, c, groesse, farbe)
_bauten.append({"c": c, "size": Vector2(groesse.x, groesse.z), "hoch": groesse.y + 3.0,
"etagen": [], "dach": [dach], "waende": [waende]})
"teile": [dach], "waende": waende})
Prims.label(self, c + Vector3(0, groesse.y + 4.2, 0), pl["name"], 0.6, Color(1, 0.95, 0.85))
_einrichtung(c, groesse, farbe, key)
@@ -463,8 +497,17 @@ func _wesen() -> void:
var w := Bewohner.new()
add_child(w)
w.boden = Callable(DreamDB, "hoehe_bei")
w.setup(DreamDB.LIST[i], i, DreamDB.PLACES, DreamDB.NETZ, DreamDB.ANKER)
w.nav_map = nav_map
w.setup(DreamDB.LIST[i], i, DreamDB.PLACES)
bewohner.append(w)
# ansprechbar: ein Wesen flüstert, was in der Wohnung des nächsten Menschen liegt
var n := Node3D.new()
n.position.y = 1.0
w.add_child(n)
n.add_to_group("interactable")
n.set_meta("kind", "wesen")
n.set_meta("arg", str(i))
n.set_meta("titel", str(DreamDB.LIST[i]["name"]))
func _process(delta: float) -> void: