|
| 1 | +extends Node |
| 2 | + |
| 3 | +const PRICE_REFRESH_INTERVAL: int = 3600 # Specifies, after how many seconds prices will be refreshed. |
| 4 | + |
| 5 | +var steam_auth_ticket : Dictionary |
| 6 | +var steam_name: String = "" |
| 7 | +var playfab_id: String = "" |
| 8 | + |
| 9 | +var inventory_items: Array = [] |
| 10 | +var inventory_item_definitions: Array = [] |
| 11 | + |
| 12 | +var _refresh_prices_timer: Timer = Timer.new() |
| 13 | + |
| 14 | +signal logged_in(playfab_id, steam_persona_name) |
| 15 | +signal inventory_updated(items: Array) |
| 16 | + |
| 17 | +func _init() -> void: |
| 18 | + self.connect("logged_in", _update_player_inventory, CONNECT_ONE_SHOT) |
| 19 | + if not ClassDB.can_instantiate("Steam"): |
| 20 | + print_debug("Steam class is not available!") |
| 21 | + return |
| 22 | + |
| 23 | + if not Steam.isSteamRunning(): |
| 24 | + print_debug("Steam client is not running!") |
| 25 | + return |
| 26 | + |
| 27 | + PlayFabManager.client.logged_in.connect(_on_logged_in) |
| 28 | + PlayFabManager.client.api_error.connect(_on_api_error) |
| 29 | + PlayFabManager.client.server_error.connect(_on_server_error) |
| 30 | + Steam.get_auth_session_ticket_response.connect(_on_get_auth_sesssion_ticket) |
| 31 | + Steam.get_ticket_for_web_api.connect(_on_get_auth_ticket_for_web_api_response) |
| 32 | + |
| 33 | + var result : Dictionary = Steam.steamInitEx(false) # Set to true if you want some local user's data |
| 34 | + if result.status > 0: |
| 35 | + print("Failure to initialize Steam with status %s" % result.status) |
| 36 | + else: |
| 37 | + create_auth_session_ticket() |
| 38 | + #create_auth_ticket_for_web_api() #Use this line instead if you need Steam Auth Ticket for Web Api |
| 39 | + |
| 40 | +func _enter_tree() -> void: |
| 41 | + add_child(_refresh_prices_timer) |
| 42 | + _request_prices() |
| 43 | + |
| 44 | +func _process(_delta: float) -> void: |
| 45 | + Steam.run_callbacks() |
| 46 | + |
| 47 | +func _exit_tree() -> void: |
| 48 | + if steam_auth_ticket.size() > 0: |
| 49 | + cancel_auth_ticket() |
| 50 | + |
| 51 | +func _on_logged_in(login_result: LoginResult) -> void: |
| 52 | + print("PlayFab Login successful: %s" % login_result) |
| 53 | + logged_in.emit(login_result.PlayFabId, Steam.getPersonaName()) |
| 54 | + |
| 55 | +func _on_api_error(error_wrapper: ApiErrorWrapper) -> void: |
| 56 | + print("PlayFab API Error: %s" % error_wrapper.errorMessage) |
| 57 | + |
| 58 | +func _on_server_error(error_wrapper: ApiErrorWrapper) -> void: |
| 59 | + print("PlayFab Server Error: %s" % error_wrapper.errorMessage) |
| 60 | + |
| 61 | +func login(ticket: String, is_auth_ticket_for_api: bool) -> void: |
| 62 | + var combined_info_request_params = GetPlayerCombinedInfoRequestParams.new() |
| 63 | + combined_info_request_params.show_all() |
| 64 | + var player_profile_view_constraints = PlayerProfileViewConstraints.new() |
| 65 | + combined_info_request_params.ProfileConstraints = player_profile_view_constraints |
| 66 | + PlayFabManager.client.login_with_steam(ticket, is_auth_ticket_for_api, true, combined_info_request_params) |
| 67 | + |
| 68 | +func cancel_auth_ticket() -> void: |
| 69 | + Steam.cancelAuthTicket(steam_auth_ticket.id) |
| 70 | + |
| 71 | +func create_auth_session_ticket() -> void: |
| 72 | + steam_auth_ticket = Steam.getAuthSessionTicket() |
| 73 | + |
| 74 | +func create_auth_ticket_for_web_api() -> void: |
| 75 | + Steam.getAuthTicketForWebApi("AzurePlayFab") |
| 76 | + |
| 77 | +func convert_auth_ticket() -> String: |
| 78 | + var ticket: String = "" |
| 79 | + for number in steam_auth_ticket.buffer: |
| 80 | + ticket += "%02X" % number |
| 81 | + return ticket |
| 82 | + |
| 83 | +func _on_get_auth_sesssion_ticket(auth_ticket_id: int, result: int) -> void: |
| 84 | + print("Auth Session Ticket (%s) return with result %s" % [auth_ticket_id, result]) |
| 85 | + if result == 1: |
| 86 | + login(convert_auth_ticket(), false) |
| 87 | + |
| 88 | +func _on_get_auth_ticket_for_web_api_response(auth_ticket: int, result: int, ticket_size: int, ticket_buffer: Array) -> void: |
| 89 | + print("Auth Ticket for Web API (%s) return with the result %s" % [auth_ticket, result]) |
| 90 | + steam_auth_ticket.id = auth_ticket |
| 91 | + steam_auth_ticket.buffer = ticket_buffer |
| 92 | + steam_auth_ticket.size = ticket_size |
| 93 | + if result == 1: |
| 94 | + login(convert_auth_ticket(), true) |
| 95 | + |
| 96 | + |
| 97 | +func _request_prices(): |
| 98 | + print("Requesting Steam prices...") |
| 99 | + Steam.requestPrices() |
| 100 | + print("Prices requested.") |
| 101 | + _refresh_prices_timer.start(PRICE_REFRESH_INTERVAL) |
| 102 | + _refresh_prices_timer.connect("timeout", _request_prices, CONNECT_ONE_SHOT) |
| 103 | + |
| 104 | +func _on_inventory_definition_update(definitions: Array) -> void: |
| 105 | + inventory_item_definitions = definitions |
| 106 | + print("Loaded %s definitions." % inventory_item_definitions.size()) |
| 107 | + |
| 108 | +func _update_player_inventory(_playFabId, _steam_persona_name) -> void: |
| 109 | + Steam.inventory_definition_update.connect(_on_inventory_definition_update) |
| 110 | + Steam.loadItemDefinitions() |
| 111 | + Steam.getAllItems() |
| 112 | + |
| 113 | + Steam.inventory_result_ready.connect(_on_inventory_result_ready) |
| 114 | + |
| 115 | +func _on_inventory_result_ready(_result: int, _inventory_handle: int): |
| 116 | + inventory_items = Steam.getResultItems(Steam.inventory_handle) |
| 117 | + inventory_updated.emit(inventory_items) |
| 118 | + print("Items in inventory: %s" % inventory_items.size()) |
| 119 | + |
| 120 | + |
| 121 | +func _grant_test_items() -> int: |
| 122 | + var items: PackedInt64Array = [1, 2] |
| 123 | + var quantities: PackedInt32Array = [2, 3] |
| 124 | + var handler = Steam.generateItems(items, quantities) |
| 125 | + return handler |
0 commit comments