diff --git a/scripts/game.gd b/scripts/game.gd index 4168bd9..ffeb3eb 100644 --- a/scripts/game.gd +++ b/scripts/game.gd @@ -63,7 +63,9 @@ func setup(cfg: Dictionary) -> void: table = GameTable.new() add_child(table) - table.build(seats.size(), local_seat) + # Der Server hat keinen Platz, legt den Tisch aber fest so, als säße Platz 0 + # unten. Diese Ausrichtung ist der Bezug für alle Würfelkoordinaten. + table.build(seats.size(), maxi(local_seat, 0)) # Ohne Platz am Tisch gibt es nichts anzuzeigen und nichts zu bedienen. if local_seat >= 0: @@ -607,12 +609,16 @@ func _pack(seat: int) -> PackedFloat32Array: func _unpack(data: PackedFloat32Array) -> void: var dl: Array = table.dice_of(local_seat) var n := mini(dl.size(), int(data.size() / 7)) + # Jeder Client dreht seinen eigenen Platz nach unten, der Server nicht. + # Ohne diese Drehung landen die eigenen Würfel in der Zone des Nachbarn. + var dreh := Transform3D(Basis(Vector3.UP, TAU * local_seat / float(seats.size())), + Vector3.ZERO) for i in n: var o := i * 7 var t := Transform3D(Basis(Quaternion(data[o + 3], data[o + 4], data[o + 5], data[o + 6])), Vector3(data[o], data[o + 1], data[o + 2])) dl[i].set_kinematic(true) - dl[i].place(t) + dl[i].place(dreh * t) @rpc("authority", "unreliable_ordered")