diff --git a/godot/src/logic/realm.gd b/godot/src/logic/realm.gd index e42bd3357..a581d4470 100644 --- a/godot/src/logic/realm.gd +++ b/godot/src/logic/realm.gd @@ -128,10 +128,11 @@ func async_clear_realm(): Global.scene_runner.kill_all_scenes() -func async_set_realm(new_realm_string: String) -> void: +func async_set_realm(new_realm_string: String, search_new_pos: bool = false) -> void: realm_string = new_realm_string realm_url = Realm.ensure_ends_with_slash(Realm.resolve_realm_url(realm_string)) realm_url = Realm.ensure_starts_with_https(realm_url) + var promise: Promise = Global.http_requester.request_json( realm_url + "about", HTTPClient.METHOD_GET, "", [] ) @@ -194,6 +195,9 @@ func async_set_realm(new_realm_string: String) -> void: realm_about.get("content", {}).get("publicUrl") ) + if not realm_scene_urns.is_empty() and search_new_pos: + await async_request_set_position(realm_scene_urns.back()) + Global.get_config().last_realm_joined = realm_url Global.get_config().save_to_settings_file() @@ -201,3 +205,33 @@ func async_set_realm(new_realm_string: String) -> void: _has_realm = true emit_signal("realm_changed") + + +func async_request_set_position(scene_urn): + prints(scene_urn) + var url = scene_urn.baseUrl + scene_urn.entityId + + var promise: Promise = Global.http_requester.request_json(url, HTTPClient.METHOD_GET, "", []) + + var res = await PromiseUtils.async_awaiter(promise) + if res is PromiseError: + printerr( + "Rejected request async_request_set_position: ", + scene_urn, + " error message: ", + res.get_error() + ) + elif res is RequestResponse: + var response: RequestResponse = res + var json: Dictionary = response.get_string_response_as_json() + if json == null: + printerr("do_request_json failed because json_string is not a valid json") + return + + var base_pos = json.get("metadata", {}).get("scene", {}).get("base", "0,0") + var coord = base_pos.split(",") + var x = int(coord[0]) + var y = int(coord[1]) + var explorer = Global.get_explorer() + if is_instance_valid(explorer): + explorer.teleport_to(Vector2i(x, y)) diff --git a/godot/src/tool/avatar_renderer/avatar_renderer_standalone.gd b/godot/src/tool/avatar_renderer/avatar_renderer_standalone.gd index dc61d49d6..19508e3e8 100644 --- a/godot/src/tool/avatar_renderer/avatar_renderer_standalone.gd +++ b/godot/src/tool/avatar_renderer/avatar_renderer_standalone.gd @@ -46,7 +46,6 @@ func _ready(): return # Disable some functions - #Global.realm.async_set_realm("null") Global.scene_runner.set_pause(true) Global.realm.content_base_url = profiles_to_process.base_url diff --git a/godot/src/ui/explorer.gd b/godot/src/ui/explorer.gd index 05e96c94d..2b928d05a 100644 --- a/godot/src/ui/explorer.gd +++ b/godot/src/ui/explorer.gd @@ -325,7 +325,7 @@ func _on_panel_chat_submit_message(message: String): panel_chat.add_chat_message( "[color=#ccc]> Trying to change to realm " + params[1] + "[/color]" ) - Global.realm.async_set_realm(params[1]) + Global.realm.async_set_realm(params[1], true) loading_ui.enable_loading_screen() elif command_str == "/clear": Global.realm.async_clear_realm() @@ -353,8 +353,9 @@ func move_to(position: Vector3, skip_loading: bool): func teleport_to(parcel: Vector2i, realm: String = ""): - if realm != Global.realm.get_realm_string(): + if not realm.is_empty() && realm != Global.realm.get_realm_string(): Global.realm.async_set_realm(realm) + move_to(Vector3i(parcel.x * 16, 3, -parcel.y * 16), false) Global.get_config().add_place_to_last_places(parcel, realm)