Godot Steam integration without rebuilding Godot. Supports π°Windows(x86_x64), π§Linux(x86_x64) & πMacOS (x86_x64/arm64).
Now you can use the following functions:
# check steam integration is working and enabled, useful if you publish to multiple stores
Steam.is_init()
# achievements
# check if player already unlocked this achievement
var has_alredy_unlocked_achievement:bool = Steam.get_achievement("gator_god")
# give the player this achievement, benign if they already have it
Steam.set_achievement("gator_god")
# clear this achievement (only for debugging)
Steam.clear_achievement("gator_god")
# stats
# set an integer stat
Steam.user_stats.set_stat("kills", 5)
var kills_stat:int = Steam.user_stats.get_stat("kills")
# set a float stat
Steam.user_stats.set_stat("time", 10.3)
var time_stat:float = Steam.user_stats.get_stat("time")
# show the progress of a stat towards some achievement
Steam.user_stats.indicate_achievement_progress("gator_god", 1, 4)
# leaderboards
Steam.set_leaderboard_score("High Scores", 1000)
# Get the first 10 global high scores
var top_10_global_scores = yield(Steam.get_leaderboard_scores("High Scores", 0, 10), "done")
# Get just the current user's high score
var players_score = yield(Steam.get_leaderboard_scores("High Scores", 0, 0, Steam.LeaderboardDataRequest.GlobalAroundUser), "done")
# Get the current user's high score and the two scores infront and behind
var player_rivals_score = yield(Steam.get_leaderboard_scores("High Scores", -1, 1, Steam.LeaderboardDataRequest.GlobalAroundUser), "done")
# rich presence
# Read the docs: https://partner.steamgames.com/doc/features/enhancedrichpresence as this call has lots of hidden magic
# and use this tool to test: https://steamcommunity.com/dev/testrichpresence
Steam.friends.set_rich_presence("status", "cactus")
Steam.friends.clear_rich_presence()
# overlay
Steam.friends.connect("game_overlay_activated", self, "_on_game_overlay_activated")
Steam.friends.activate_game_overlay_to_web_page("https://steamcommunity.com/")
Steam.friends.activate_game_overlay_to_store(1435470, Steam.OverlayToStoreFlag.AddToCart)
# Check if the game runs on the Steam Deck
Steam.utils.is_running_on_steam_deck()
This plugin follows the structure and naming of the offical C++ SteamSDK almost verbatim. The only major difference is I use snake_case to better integrate with Godot. That is to say, you can just rely on the offical docs: https://partner.steamgames.com/doc/api.
Steam integration doesn't work with exported builds straight away. You'll have to either:
steam_appid.txt
with just your steam app id in it. Though do not upload this file as part of your build.Yes. There's a flag that disables the integration, i.e. all calls on the API just do nothing and return/yield null. However it is up to the caller to then safely deal with the null values returned by the API in disabled mode. You can set the flag in two ways:
A. Set Project Settings > Steam API > Disable Steam Integration [x]
.
B. Or add disable_steam_integration
to your export's feature flags.
No and intentionally. You can configure automatic cloud saves in the SteamWorks settings. Just give it a filesystem path and it magically syncs it. We've found this automatic support is, for most use cases, safer than rolling your own.
A ton of projects on Steam use this plugin. Here's just a few of my favourite:
πΎ Beat Invaders, π Space Bandit, π Franz Fury, ποΈ The Ballad of Bonky, π² Hack Grid, π Dark Crypt, ποΈ Red Nivis, π° Sokobos, π Dark Sheep, πͺ Mirrorama, π Letters from the Moon, π©πΎβπ¦° ROTA, π© Donut Dodo.
This plugin doesn't implement the entirety of the Steam API. But if there's a Steam API feature you need, leave a github issue stating why you need the feature and I'll try add support when I can.