Giving network manager the authority and sky sync?

This commit is contained in:
Chris Bell 2024-12-15 15:12:50 -06:00
parent e6288189ca
commit 353336eddf
3 changed files with 49 additions and 18 deletions

View File

@ -30,6 +30,18 @@ var moonPosition : float = 0.0
var star_alpha var star_alpha
var start_time : float = 0.0 var start_time : float = 0.0
var network_uuid: int = 0
var time_of_day_cache: float = 0.0
func _ready() -> void:
NetworkManager.register_node(self)
network_uuid = NetworkManager.get_network_uuid(self)
NetworkManager.property_update_received.connect(_on_property_update)
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
_updateRotation() _updateRotation()
_updateSky() _updateSky()
@ -37,11 +49,19 @@ func _physics_process(delta: float) -> void:
_simulateTime(delta) _simulateTime(delta)
_updateFog() _updateFog()
_updateStars(delta) _updateStars(delta)
func _process(delta: float) -> void:
if !NetworkManager.has_network_authority: return
if time_of_day_cache != timeOfDay:
NetworkManager.sync_property(network_uuid, "timeOfDay", timeOfDay)
func _simulateTime(delta): func _simulateTime(delta):
if !NetworkManager.has_network_authority: return
if simulatingTime: if simulatingTime:
timeOfDay += (rateOfTime / 36) * delta timeOfDay += (rateOfTime / 36) * delta
timeOfDay = wrapf(timeOfDay, 0.0, 2400.0) timeOfDay = wrapf(timeOfDay, 0.0, 2400.0)
time_of_day_cache = timeOfDay
func _updateLight(): func _updateLight():
sunPosition = sun_directional_light_3d.global_position.y + 0.5 sunPosition = sun_directional_light_3d.global_position.y + 0.5
@ -84,3 +104,11 @@ func _updateSky():
# Match ground to gradient color # Match ground to gradient color
skyMaterial.ground_bottom_color = sky_base_color_gradient.gradient.sample(sunPosition) # sample gradient and set ground top color to match based on the time of day skyMaterial.ground_bottom_color = sky_base_color_gradient.gradient.sample(sunPosition) # sample gradient and set ground top color to match based on the time of day
skyMaterial.ground_horizon_color = sky_sun_set_rise_color_gradient.gradient.sample(sunPosition) # sample gradient and set ground horizon color to match based on the time of day skyMaterial.ground_horizon_color = sky_sun_set_rise_color_gradient.gradient.sample(sunPosition) # sample gradient and set ground horizon color to match based on the time of day
func _on_property_update(uuid: int, property: String, value: Variant) -> void:
if NetworkManager.node_map.has(uuid):
var node = NetworkManager.node_map[uuid]
node.set(property, value)
else:
printerr("Received property update but node_id is wrong? Expected " + str(network_uuid) + " but got " + str(uuid))

View File

@ -4,6 +4,8 @@ const STEAM_APP_ID: int = 480
const PACKET_READ_LIMIT: int = 32 const PACKET_READ_LIMIT: int = 32
var has_network_authority: bool = false
var level_scene: PackedScene var level_scene: PackedScene
var player_scene: PackedScene var player_scene: PackedScene
@ -314,15 +316,15 @@ func read_p2p_packet() -> void:
#print("Received property update packet for node %d: %s = %s" % [readable_data["node_id"], readable_data["property_name"], readable_data["value"]]) #print("Received property update packet for node %d: %s = %s" % [readable_data["node_id"], readable_data["property_name"], readable_data["value"]])
func register_node(node: Node) -> String: func register_node(node: Node) -> int:
var uuid = generate_uuid() var uuid = generate_uuid()
node_map[uuid] = node node_map[uuid] = node
return uuid return uuid
func generate_uuid() -> String: func generate_uuid() -> int:
uuid_counter += 1 uuid_counter += 1
return str(uuid_counter) return uuid_counter
func request_player_avatar(user_id: int, size: int = 128) -> void: func request_player_avatar(user_id: int, size: int = 128) -> void:
@ -374,14 +376,16 @@ func _on_game_started():
player.username = Steam.getFriendPersonaName(member["steam_id"]) player.username = Steam.getFriendPersonaName(member["steam_id"])
if member["steam_id"] == steam_id: if member["steam_id"] == steam_id:
has_network_authority = true
player.is_network_authority = true player.is_network_authority = true
else: else:
has_network_authority = false
player.is_network_authority = false player.is_network_authority = false
level.add_child(player) level.add_child(player)
func sync_property(node_id: String, property_name: String, value: Variant): func sync_property(node_id: int, property_name: String, value: Variant):
var packet_data = {"message":"property_update", "node_id": node_id, "property_name":property_name, "value":value} var packet_data = {"message":"property_update", "node_id": node_id, "property_name":property_name, "value":value}
send_p2p_packet(0, packet_data) send_p2p_packet(0, packet_data)

View File

@ -4,8 +4,7 @@ var player_tag: Label3D
var username: String = "" var username: String = ""
var is_piloting: bool = false var is_piloting: bool = false
var is_network_authority: bool = false var network_uuid: int
var network_uuid: String = ""
var steam_id: int = 0 var steam_id: int = 0
@export_category("Player") @export_category("Player")
@ -34,17 +33,17 @@ var previous_global_rotation: Vector3
func _ready() -> void: func _ready() -> void:
NetworkManager.property_update_received.connect(_on_property_update) NetworkManager.property_update_received.connect(_on_property_update)
network_uuid = NetworkManager.register_node(self) network_uuid = NetworkManager.get_network_uuid(self)
player_tag = get_node("PlayerTag") player_tag = get_node("PlayerTag")
player_tag.text = username player_tag.text = username
if is_network_authority: if NetworkManager.has_network_authority:
camera.make_current() camera.make_current()
func _unhandled_input(event: InputEvent) -> void: func _unhandled_input(event: InputEvent) -> void:
if !is_network_authority: return if !NetworkManager.has_network_authority: return
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
is_using_joystick = false is_using_joystick = false
@ -57,7 +56,7 @@ func _unhandled_input(event: InputEvent) -> void:
func _input(event): func _input(event):
if !is_network_authority: return if !NetworkManager.has_network_authority: return
if event.is_action_pressed("esc") and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: if event.is_action_pressed("esc") and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
release_mouse() release_mouse()
elif event.is_action_pressed("esc") and not Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: elif event.is_action_pressed("esc") and not Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
@ -65,7 +64,7 @@ func _input(event):
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
if !is_network_authority: return if !NetworkManager.has_network_authority: return
if current_ship != null: if current_ship != null:
if is_piloting: #if we are piloting a ship if is_piloting: #if we are piloting a ship
global_transform.basis = current_ship.global_transform.basis global_transform.basis = current_ship.global_transform.basis
@ -84,7 +83,7 @@ func _physics_process(delta: float) -> void:
func _process(delta: float) -> void: func _process(delta: float) -> void:
if !is_network_authority: return if !NetworkManager.has_network_authority: return
# If the global_position has changed, notify the NetworkManager # If the global_position has changed, notify the NetworkManager
if previous_global_position != global_position: if previous_global_position != global_position:
@ -96,17 +95,17 @@ func _process(delta: float) -> void:
func capture_mouse() -> void: func capture_mouse() -> void:
if !is_network_authority: return if !NetworkManager.has_network_authority: return
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func release_mouse() -> void: func release_mouse() -> void:
if !is_network_authority: return if !NetworkManager.has_network_authority: return
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
func _rotate_camera(sens_mod: float = 1.0) -> void: func _rotate_camera(sens_mod: float = 1.0) -> void:
if !is_network_authority: return if !NetworkManager.has_network_authority: return
var camera_sens_final = camera_sens var camera_sens_final = camera_sens
if is_using_joystick: if is_using_joystick:
camera_sens_final = camera_sens * joystick_camera_sens_multiplier camera_sens_final = camera_sens * joystick_camera_sens_multiplier
@ -147,21 +146,21 @@ func _jump(delta: float) -> Vector3:
func player_entered_ship(ship_global_position: Vector3, ship: Ship): func player_entered_ship(ship_global_position: Vector3, ship: Ship):
if !is_network_authority: return if !NetworkManager.has_network_authority: return
current_ship = ship current_ship = ship
print(ship.ship_id) print(ship.ship_id)
print(global_position) print(global_position)
func player_exited_ship(ship_global_position: Vector3, ship: Ship): func player_exited_ship(ship_global_position: Vector3, ship: Ship):
if !is_network_authority: return if !NetworkManager.has_network_authority: return
current_ship = null current_ship = null
print(ship.ship_id) print(ship.ship_id)
print(global_position) print(global_position)
func set_is_piloting(state: bool): func set_is_piloting(state: bool):
if !is_network_authority: return if !NetworkManager.has_network_authority: return
is_piloting = state is_piloting = state
GameConsole.log_debug("player pilot state" + str(is_piloting)) GameConsole.log_debug("player pilot state" + str(is_piloting))