|
|
@ -1,13 +1,17 @@ |
|
|
|
class_name copyMultiplayer |
|
|
|
#class_name copyMultiplayer |
|
|
|
extends Mod_Base |
|
|
|
extends Mod_Base |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# NOTE: Due to issues with resource pack loading at runtime, we can't use |
|
|
|
|
|
|
|
# typed references to this mod. This is a crime to all slime-kind. |
|
|
|
|
|
|
|
static var SyncController = load("res://Mods/copyMultiplayer/Scenes/sync_controller.gd") |
|
|
|
|
|
|
|
|
|
|
|
@export var cache := "" |
|
|
|
@export var cache := "" |
|
|
|
@export var nickname := "" |
|
|
|
@export var nickname := "" |
|
|
|
@export var address := "" |
|
|
|
@export var address := "" |
|
|
|
@export var port := 52410 |
|
|
|
@export var port := 52410 |
|
|
|
|
|
|
|
|
|
|
|
var main_controller: ModelController |
|
|
|
var main_controller: ModelController |
|
|
|
var main_stats : PlayerStats |
|
|
|
var main_stats #: PlayerStats |
|
|
|
var ping_update_timer: Timer |
|
|
|
var ping_update_timer: Timer |
|
|
|
|
|
|
|
|
|
|
|
## Hardcoded list of bone names that will get syncronized. |
|
|
|
## Hardcoded list of bone names that will get syncronized. |
|
|
@ -58,7 +62,7 @@ func _ready() -> void: |
|
|
|
setup_button_connections() |
|
|
|
setup_button_connections() |
|
|
|
|
|
|
|
|
|
|
|
# Filter whitespace characters from nickname before saving it to "nickname" field. |
|
|
|
# Filter whitespace characters from nickname before saving it to "nickname" field. |
|
|
|
var nickname_widget := get_settings_window().settings_nickname |
|
|
|
var nickname_widget = get_settings_window().settings_nickname |
|
|
|
nickname_widget.text_changed.connect(func(new_text): modify_setting("nickname", new_text.strip_edges())) |
|
|
|
nickname_widget.text_changed.connect(func(new_text): modify_setting("nickname", new_text.strip_edges())) |
|
|
|
nickname_widget.text_submitted.connect(func(_new_text): nickname_widget.text = nickname; main_stats.set_nickname(nickname)) |
|
|
|
nickname_widget.text_submitted.connect(func(_new_text): nickname_widget.text = nickname; main_stats.set_nickname(nickname)) |
|
|
|
nickname_widget.focus_exited.connect(func(): nickname_widget.text = nickname) |
|
|
|
nickname_widget.focus_exited.connect(func(): nickname_widget.text = nickname) |
|
|
@ -76,11 +80,11 @@ func _create_settings_window() -> Control: |
|
|
|
return load("res://Mods/copyMultiplayer/Scenes/copy_multiplayer_settings.tscn").instantiate() |
|
|
|
return load("res://Mods/copyMultiplayer/Scenes/copy_multiplayer_settings.tscn").instantiate() |
|
|
|
|
|
|
|
|
|
|
|
# Override base method to provide type hint. |
|
|
|
# Override base method to provide type hint. |
|
|
|
func get_settings_window() -> copyMultiplayerSettings: |
|
|
|
# func get_settings_window() -> copyMultiplayerSettings: |
|
|
|
return super.get_settings_window() |
|
|
|
# return super.get_settings_window() |
|
|
|
|
|
|
|
|
|
|
|
func setup_setting_widget(category: String, setting: String, setup_events: bool) -> void: |
|
|
|
func setup_setting_widget(category: String, setting: String, setup_events: bool) -> void: |
|
|
|
var settings := get_settings_window() |
|
|
|
var settings = get_settings_window() |
|
|
|
var widget: Control = settings.get("%s_%s" % [ category, setting ]) |
|
|
|
var widget: Control = settings.get("%s_%s" % [ category, setting ]) |
|
|
|
|
|
|
|
|
|
|
|
_settings_properties.append({ name = setting, args = { } }) |
|
|
|
_settings_properties.append({ name = setting, args = { } }) |
|
|
@ -97,7 +101,7 @@ func setup_setting_widget(category: String, setting: String, setup_events: bool) |
|
|
|
widget.set_meta("reset_button", { }) |
|
|
|
widget.set_meta("reset_button", { }) |
|
|
|
|
|
|
|
|
|
|
|
func setup_button_connections() -> void: |
|
|
|
func setup_button_connections() -> void: |
|
|
|
var settings := get_settings_window() |
|
|
|
var settings = get_settings_window() |
|
|
|
settings.connect_join.pressed.connect(on_join_pressed) |
|
|
|
settings.connect_join.pressed.connect(on_join_pressed) |
|
|
|
settings.connect_host.pressed.connect(on_host_pressed) |
|
|
|
settings.connect_host.pressed.connect(on_host_pressed) |
|
|
|
settings.connect_disconnect.pressed.connect(on_disconnect_pressed) |
|
|
|
settings.connect_disconnect.pressed.connect(on_disconnect_pressed) |
|
|
@ -107,14 +111,14 @@ func load_after(_old : Dictionary, _new : Dictionary) -> void: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var player_settings_scene: PackedScene = load("res://Mods/copyMultiplayer/Scenes/player_settings.tscn") |
|
|
|
var player_settings_scene: PackedScene = load("res://Mods/copyMultiplayer/Scenes/player_settings.tscn") |
|
|
|
func new_player_settings() -> PlayerSettings: |
|
|
|
func new_player_settings(): #-> PlayerSettings: |
|
|
|
var container = get_settings_window().get_node("Players/VBoxContainer") |
|
|
|
var container = get_settings_window().get_node("Players/VBoxContainer") |
|
|
|
var result := player_settings_scene.instantiate() |
|
|
|
var result := player_settings_scene.instantiate() |
|
|
|
container.add_child(result) |
|
|
|
container.add_child(result) |
|
|
|
return result |
|
|
|
return result |
|
|
|
|
|
|
|
|
|
|
|
var player_stats_scene: PackedScene = load("res://Mods/copyMultiplayer/Scenes/player_stats.tscn") |
|
|
|
var player_stats_scene: PackedScene = load("res://Mods/copyMultiplayer/Scenes/player_stats.tscn") |
|
|
|
func new_player_stats() -> PlayerStats: |
|
|
|
func new_player_stats(): #-> PlayerStats: |
|
|
|
var container = get_settings_window().get_node("Stats/VBoxContainer") |
|
|
|
var container = get_settings_window().get_node("Stats/VBoxContainer") |
|
|
|
var result := player_stats_scene.instantiate() |
|
|
|
var result := player_stats_scene.instantiate() |
|
|
|
container.add_child(result) |
|
|
|
container.add_child(result) |
|
|
@ -202,7 +206,7 @@ func on_server_disconnected() -> void: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func update_enabled_state(is_online: bool) -> void: |
|
|
|
func update_enabled_state(is_online: bool) -> void: |
|
|
|
var settings := get_settings_window() |
|
|
|
var settings = get_settings_window() |
|
|
|
settings.settings_nickname .editable = !is_online |
|
|
|
settings.settings_nickname .editable = !is_online |
|
|
|
settings.connect_address .editable = !is_online |
|
|
|
settings.connect_address .editable = !is_online |
|
|
|
settings.connect_port .editable = !is_online |
|
|
|
settings.connect_port .editable = !is_online |
|
|
@ -220,10 +224,9 @@ func update_status() -> void: |
|
|
|
|
|
|
|
|
|
|
|
## Removes all networked player models. |
|
|
|
## Removes all networked player models. |
|
|
|
func clear_player_models() -> void: |
|
|
|
func clear_player_models() -> void: |
|
|
|
for controller in get_children(): |
|
|
|
for controller in get_all_sync_controllers(): |
|
|
|
if controller is SyncController: |
|
|
|
remove_child(controller) |
|
|
|
remove_child(controller) |
|
|
|
controller.queue_free() |
|
|
|
controller.queue_free() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _process(_delta: float) -> void: |
|
|
|
func _process(_delta: float) -> void: |
|
|
@ -266,19 +269,21 @@ func scene_init() -> void: |
|
|
|
change_model.rpc(version, bone_lookup, blendshape_lookup, filename) |
|
|
|
change_model.rpc(version, bone_lookup, blendshape_lookup, filename) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func get_sync_controller(peer_id: int) -> SyncController: |
|
|
|
func get_sync_controller(peer_id: int): #-> SyncController: |
|
|
|
return get_node_or_null(str(peer_id)) as SyncController |
|
|
|
return get_node_or_null(str(peer_id)) #as SyncController |
|
|
|
|
|
|
|
|
|
|
|
func get_all_sync_controllers() -> Array[SyncController]: |
|
|
|
func get_all_sync_controllers(): #-> Array[SyncController]: |
|
|
|
var result: Array[SyncController] = [] |
|
|
|
return get_children() |
|
|
|
for controller in get_children(): |
|
|
|
# NOTE: Let's just assume all child nodes are SyncController. |
|
|
|
if controller is SyncController: |
|
|
|
# var result: Array[SyncController] = [] |
|
|
|
result.append(controller) |
|
|
|
# for controller in get_children(): |
|
|
|
return result |
|
|
|
# if controller is SyncController: |
|
|
|
|
|
|
|
# result.append(controller) |
|
|
|
|
|
|
|
# return result |
|
|
|
|
|
|
|
|
|
|
|
func get_player_stats(peer_id: int) -> PlayerStats: |
|
|
|
func get_player_stats(peer_id: int): #-> PlayerStats: |
|
|
|
if peer_id == multiplayer.get_unique_id(): return main_stats |
|
|
|
if peer_id == multiplayer.get_unique_id(): return main_stats |
|
|
|
var controller := get_sync_controller(peer_id) |
|
|
|
var controller = get_sync_controller(peer_id) |
|
|
|
if controller: return controller.stats |
|
|
|
if controller: return controller.stats |
|
|
|
return null |
|
|
|
return null |
|
|
|
|
|
|
|
|
|
|
@ -288,7 +293,7 @@ func update_pings(pairs: Array[int]) -> void: |
|
|
|
for i in range(0, pairs.size(), 2): |
|
|
|
for i in range(0, pairs.size(), 2): |
|
|
|
var peer_id := pairs[i] |
|
|
|
var peer_id := pairs[i] |
|
|
|
var ping := pairs[i + 1] |
|
|
|
var ping := pairs[i + 1] |
|
|
|
var stats := get_player_stats(peer_id) |
|
|
|
var stats = get_player_stats(peer_id) |
|
|
|
if stats: stats.set_ping(ping) |
|
|
|
if stats: stats.set_ping(ping) |
|
|
|
|
|
|
|
|
|
|
|
func do_update_pings() -> void: |
|
|
|
func do_update_pings() -> void: |
|
|
@ -303,7 +308,7 @@ func do_update_pings() -> void: |
|
|
|
@rpc("any_peer", "reliable") |
|
|
|
@rpc("any_peer", "reliable") |
|
|
|
func change_nickname(new_nickname: String) -> void: |
|
|
|
func change_nickname(new_nickname: String) -> void: |
|
|
|
var peer_id := multiplayer.get_remote_sender_id() |
|
|
|
var peer_id := multiplayer.get_remote_sender_id() |
|
|
|
var controller := get_sync_controller(peer_id) |
|
|
|
var controller = get_sync_controller(peer_id) |
|
|
|
if controller: controller.change_nickname(new_nickname) |
|
|
|
if controller: controller.change_nickname(new_nickname) |
|
|
|
|
|
|
|
|
|
|
|
@rpc("any_peer", "reliable") |
|
|
|
@rpc("any_peer", "reliable") |
|
|
@ -314,7 +319,7 @@ func change_model( |
|
|
|
filename: String, |
|
|
|
filename: String, |
|
|
|
) -> void: |
|
|
|
) -> void: |
|
|
|
var peer_id := multiplayer.get_remote_sender_id() |
|
|
|
var peer_id := multiplayer.get_remote_sender_id() |
|
|
|
var controller := get_sync_controller(peer_id) |
|
|
|
var controller = get_sync_controller(peer_id) |
|
|
|
if controller: controller.change_model(new_version, new_bone_lookup, new_blendshape_lookup, filename) |
|
|
|
if controller: controller.change_model(new_version, new_bone_lookup, new_blendshape_lookup, filename) |
|
|
|
|
|
|
|
|
|
|
|
@rpc("any_peer", "unreliable_ordered") |
|
|
|
@rpc("any_peer", "unreliable_ordered") |
|
|
@ -324,5 +329,5 @@ func sync_model_animation( |
|
|
|
buffer: PackedByteArray, |
|
|
|
buffer: PackedByteArray, |
|
|
|
) -> void: |
|
|
|
) -> void: |
|
|
|
var peer_id := multiplayer.get_remote_sender_id() |
|
|
|
var peer_id := multiplayer.get_remote_sender_id() |
|
|
|
var controller := get_sync_controller(peer_id) |
|
|
|
var controller = get_sync_controller(peer_id) |
|
|
|
if controller: controller.sync_model_animation(current_version, uncompressed_length, buffer) |
|
|
|
if controller: controller.sync_model_animation(current_version, uncompressed_length, buffer) |
|
|
|