Compare commits

...

1 Commits

Author SHA1 Message Date
Florian Rival
2496fc3eef Revert "Add extension to support Steamworks integration of games made with GDevelop (#5401)" (#5438)
This reverts commit 3c43f28966.
2023-06-22 12:58:00 +02:00
8 changed files with 7 additions and 2344 deletions

View File

@@ -127,7 +127,5 @@
"flow.useNPMPackagedFlow": true,
// Clang format styling (duplicated in scripts/CMakeClangUtils.txt)
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, BinPackParameters: false, BinPackArguments: false}",
"prettier.prettierPath": "./GDJS/node_modules/prettier",
"prettier.configPath": "./GDJS/.prettierrc"
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, BinPackParameters: false, BinPackArguments: false}"
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,63 +0,0 @@
namespace gdjs {
export namespace steamworks {
gdjs.registerFirstRuntimeSceneLoadedCallback(() => {
if (gdjs.steamworks.steamAPI) gdjs.steamworks.steamAPI.input.init();
});
export function getControllerCount(): integer {
return gdjs.steamworks.steamAPI
? gdjs.steamworks.steamAPI.input.getControllers().length
: 0;
}
export function activateActionSet(
controllerIndex: number,
actionSetName: string
): void {
if (!gdjs.steamworks.steamAPI) return;
gdjs.steamworks.steamAPI.input
.getControllers()
[controllerIndex]?.activateActionSet(
gdjs.steamworks.steamAPI.input.getActionSet(actionSetName)
);
}
export function isDigitalActionPressed(
controllerIndex: number,
actionName: string
): boolean {
if (!gdjs.steamworks.steamAPI) return false;
return !!gdjs.steamworks.steamAPI.input
.getControllers()
[controllerIndex]?.isDigitalActionPressed(
gdjs.steamworks.steamAPI.input.getDigitalAction(actionName)
);
}
export function getAnalogActionVectorX(
controllerIndex: number,
actionName: string
): float {
return gdjs.steamworks.steamAPI
? gdjs.steamworks.steamAPI.input
.getControllers()
[controllerIndex]?.getAnalogActionVector(
gdjs.steamworks.steamAPI.input.getAnalogAction(actionName)
).x ?? 0
: 0;
}
export function getAnalogActionVectorY(
controllerIndex: number,
actionName: string
): float {
return gdjs.steamworks.steamAPI
? gdjs.steamworks.steamAPI.input
.getControllers()
[controllerIndex]?.getAnalogActionVector(
gdjs.steamworks.steamAPI.input.getAnalogAction(actionName)
).y ?? 0
: 0;
}
}
}

View File

@@ -1,566 +0,0 @@
namespace gdjs {
export namespace steamworks {
const logger = new gdjs.Logger('Steamworks');
export let steamAPI: import('steamworks.js').Client | null = null;
gdjs.registerFirstRuntimeSceneLoadedCallback((runtimeScene) => {
const remote = runtimeScene.getGame().getRenderer().getElectronRemote();
if (!remote) return; // Steamworks is only supported on electron
const steamworks_js = remote.require(
'steamworks.js'
) as typeof import('steamworks.js');
// Sets the proper electron flags for the steam overlay to function properly
steamworks_js.electronEnableSteamOverlay();
const unparsedAppID = runtimeScene
.getGame()
.getExtensionProperty('Steamworks', 'AppID');
if (!unparsedAppID) {
logger.error(
'A steam AppID needs to be configured in the game properties for steamworks features to be used!'
);
return;
}
const appID = parseInt(unparsedAppID, 10);
// Restart the game through steam if it needs to be launched with steam but has not been
if (
runtimeScene
.getGame()
.getExtensionProperty('Steamworks', 'RequireSteam') &&
!runtimeScene.getGame().isPreview() &&
steamworks_js.restartAppIfNecessary(appID)
) {
remote.process.exit(1);
return;
}
steamAPI = steamworks_js.init(appID);
});
// ---
export function claimAchievement(achievement: string): void {
if (steamAPI) steamAPI.achievement.activate(achievement);
else
logger.warn(
`Could not claim achievement ${achievement}, steamworks was not properly loaded!`
);
}
export function unclaimAchievement(achievement: string): void {
if (steamAPI) steamAPI.achievement.clear(achievement);
else
logger.warn(
`Could not unclaim achievement ${achievement}, steamworks was not properly loaded!`
);
}
export function hasAchievement(achievement: string): boolean {
return !!steamAPI && steamAPI.achievement.isActivated(achievement);
}
// ---
export function getSteamId(): string {
return steamAPI
? steamAPI.localplayer.getSteamId().steamId64.toString(10)
: '';
}
export function getName(): string {
return steamAPI ? steamAPI.localplayer.getName() : 'Unknown';
}
export function getCountry(): string {
return steamAPI ? steamAPI.localplayer.getIpCountry() : 'Unknown';
}
export function getLevel(): number {
return steamAPI ? steamAPI.localplayer.getLevel() : 0;
}
export function setRichPresence(key: string, value: string): void {
if (steamAPI) steamAPI.localplayer.setRichPresence(key, value);
else
logger.warn(
`Could not set the rich presence, steamworks was not properly loaded!`
);
}
// ---
export function isSteamworksProperlyLoaded(): boolean {
return !!steamAPI;
}
export function getAppID(): number {
return steamAPI ? steamAPI.utils.getAppId() : 0;
}
export function getServerRealTime(): number {
return steamAPI ? steamAPI.utils.getServerRealTime() : Date.now();
}
export function isOnSteamDeck(): boolean {
return steamAPI ? steamAPI.utils.isSteamRunningOnSteamDeck() : false;
}
// ---
enum LobbyType {
Private = 0,
FriendsOnly = 1,
Public = 2,
Invisible = 3,
}
const knownLobbies = new Map<
string,
import('steamworks.js/client').matchmaking.Lobby
>();
let currentLobby:
| import('steamworks.js/client').matchmaking.Lobby
| null = null;
export function getKnownLobby(lobbyId: string) {
if (!steamAPI) {
logger.warn(
`Could not access lobby '${lobbyId}', steamworks was not properly loaded!`
);
return null;
}
const lobby = knownLobbies.get(lobbyId);
if (!lobby) {
logger.error(
`Could not access lobby '${lobbyId}'! You might need to join it before trying to access it.`
);
return null;
}
return lobby;
}
export function createLobby(
lobbyType: 'Private' | 'FriendsOnly' | 'Public' | 'Invisible',
maxPlayers: number,
result: gdjs.Variable
): gdjs.AsyncTask {
if (steamAPI) {
return new gdjs.PromiseTask(
steamAPI.matchmaking
.createLobby(
LobbyType[lobbyType] as any /* Const enums are 😩 */,
maxPlayers
)
.then((lobby) => {
const id = lobby.id.toString(10);
knownLobbies.set(id, lobby);
currentLobby = lobby;
result.setString(id);
})
.catch(() => {
result.setString('failure');
})
);
} else {
logger.warn(
`Could not create a lobby, steamworks was not properly loaded!`
);
return new gdjs.ResolveTask();
}
}
export function getLobbiesList(results: gdjs.Variable): gdjs.AsyncTask {
if (steamAPI) {
return new gdjs.PromiseTask(
steamAPI.matchmaking
.getLobbies()
.then((lobbies) => {
const allLobbiesIds = lobbies.map((lobby) => {
const id = lobby.id.toString(10);
knownLobbies.set(id, lobby);
return id;
});
results.fromJSObject(allLobbiesIds);
})
.catch(() => {
results.setString('failure');
})
);
} else {
logger.warn(
`Could not obtain the lobbies list, steamworks was not properly loaded!`
);
return new gdjs.ResolveTask();
}
}
export function joinLobby(
lobbyId: string,
result: gdjs.Variable
): gdjs.AsyncTask {
if (steamAPI) {
return new gdjs.PromiseTask(
steamAPI.matchmaking
.joinLobby(BigInt(lobbyId))
.then((lobby) => {
knownLobbies.set(lobbyId, lobby);
currentLobby = lobby;
result.setString(lobbyId);
})
.catch(() => {
result.setString('failure');
})
);
} else {
logger.warn(
`Could not join a lobby, steamworks was not properly loaded!`
);
return new gdjs.ResolveTask();
}
}
export function getCurrentLobbyId(): string {
return currentLobby ? currentLobby.id.toString(10) : 'none';
}
export function leaveCurrentLobby(): void {
if (currentLobby) currentLobby.leave();
}
export function openDialogForInvitingUsersToTheCurrentLobby(): void {
if (currentLobby) currentLobby.openInviteDialog();
}
export function getCurrentLobbyAttribute(attribute: string): string {
if (!currentLobby) return '';
const data = currentLobby.getData(attribute);
return data === null ? '' : data;
}
export function getLobbyAttribute(
lobbyId: string,
attribute: string
): string {
const lobby = getKnownLobby(lobbyId);
if (!lobby) return '';
const data = lobby.getData(attribute);
return data === null ? '' : data;
}
export function setCurrentLobbyAttribute(
attribute: string,
value: string,
success: gdjs.Variable
): void {
if (currentLobby)
success.setBoolean(currentLobby.setData(attribute, value));
}
export function setCurrentLobbyJoinability(
shouldBeJoinable: boolean,
success: gdjs.Variable
): void {
if (currentLobby)
success.setBoolean(currentLobby.setJoinable(shouldBeJoinable));
}
export function getCurrentLobbyMemberCount(): number {
return currentLobby ? Number(currentLobby.getMemberCount()) : 0;
}
export function getLobbyMemberCount(lobbyId: string): number {
const lobby = getKnownLobby(lobbyId);
return lobby ? Number(lobby.getMemberCount()) : 0;
}
export function getCurrentLobbyMemberLimit(): number {
return currentLobby ? Number(currentLobby.getMemberLimit()) : 0;
}
export function getLobbyMemberLimit(lobbyId: string): number {
const lobby = getKnownLobby(lobbyId);
if (!lobby) return 0;
return lobby ? Number(lobby.getMemberLimit()) : 0;
}
export function getCurrentLobbyOwner(): string {
return currentLobby ? currentLobby.getOwner().steamId64.toString(10) : '';
}
export function getLobbyOwner(lobbyId: string): string {
const lobby = getKnownLobby(lobbyId);
return lobby ? lobby.getOwner().steamId64.toString(10) : '';
}
export function getCurrentLobbyMembersList(storeIn: gdjs.Variable): void {
if (currentLobby) {
storeIn.fromJSObject(
currentLobby
.getMembers()
.map((steamID) => steamID.steamId64.toString(10))
);
}
}
export function getLobbyMembersList(
lobbyId: string,
storeIn: gdjs.Variable
): void {
const lobby = getKnownLobby(lobbyId);
if (lobby) {
storeIn.fromJSObject(
lobby.getMembers().map((steamID) => steamID.steamId64.toString(10))
);
}
}
// ---
export function isAppOwned(appId: string): boolean {
return !!steamAPI && steamAPI.apps.isSubscribedApp(Number(appId));
}
export function isAppInstalled(appId: string): boolean {
return !!steamAPI && steamAPI.apps.isAppInstalled(Number(appId));
}
export function isDLCInstalled(dlcId: string): boolean {
return !!steamAPI && steamAPI.apps.isDlcInstalled(Number(dlcId));
}
export function getAppInstallDirectory(appId: string): string {
return steamAPI ? steamAPI.apps.appInstallDir(Number(appId)) : '';
}
export function isVacBanned(): boolean {
return !!steamAPI && steamAPI.apps.isVacBanned();
}
export function isLowViolence(): boolean {
return !!steamAPI && steamAPI.apps.isLowViolence();
}
export function userBoughtTheGame(): boolean {
return !!steamAPI && steamAPI.apps.isSubscribed();
}
export function currentGameLanguage(): string {
return steamAPI ? steamAPI.apps.currentGameLanguage() : '';
}
export function currentBetaName(): string {
return steamAPI ? steamAPI.apps.currentBetaName() || '' : '';
}
export function getBuildId(): number {
return steamAPI ? steamAPI.apps.appBuildId() : 0;
}
// ---
export function isCloudEnabled(): boolean {
return (
!!steamAPI &&
steamAPI.cloud.isEnabledForAccount() &&
steamAPI.cloud.isEnabledForApp()
);
}
export function readFile(fileName: string): string {
return steamAPI ? steamAPI.cloud.readFile(fileName) : '';
}
export function writeFile(
fileName: string,
content: string,
results: gdjs.Variable
): void {
if (steamAPI)
results.setBoolean(steamAPI.cloud.writeFile(fileName, content));
}
export function fileExists(fileName: string): boolean {
return steamAPI ? steamAPI.cloud.fileExists(fileName) : false;
}
export function deleteFile(fileName: string, results: gdjs.Variable): void {
if (steamAPI) results.setBoolean(steamAPI.cloud.deleteFile(fileName));
}
// ---
export function createWorkshopItem(result: gdjs.Variable): gdjs.AsyncTask {
if (steamAPI)
return new gdjs.PromiseTask(
steamAPI.workshop
.createItem()
.then(({ itemId }) => {
result.setString(itemId.toString());
})
.catch(() => {
result.setString('failure');
})
);
else {
result.setString('failure');
return new gdjs.ResolveTask();
}
}
enum UgcItemVisibility {
Public = 0,
FriendsOnly = 1,
Private = 2,
Unlisted = 3,
}
export function updateWorkshopItem(
itemId: string,
title: string,
description: string,
changeNote: string,
previewPath: string,
contentPath: string,
tags: string,
visibility: keyof import('steamworks.js/client').workshop.UgcItemVisibility,
result: gdjs.Variable
): gdjs.AsyncTask {
if (steamAPI) {
const changes: import('steamworks.js/client').workshop.UgcUpdate = {};
if (title) changes.title = title;
if (description) changes.description = description;
if (changeNote) changes.changeNote = changeNote;
if (previewPath) changes.previewPath = previewPath;
if (contentPath) changes.contentPath = contentPath;
if (tags) changes.tags = tags.split(',');
if (visibility)
//@ts-ignore const enum 😩
changes.visibility = UgcItemVisibility[visibility];
return new gdjs.PromiseTask(
steamAPI.workshop
.updateItem(BigInt(itemId), changes)
.then(() => {
result.setBoolean(true);
})
.catch(() => {
result.setBoolean(false);
})
);
} else {
result.setBoolean(false);
return new gdjs.ResolveTask();
}
}
export function subscribeToWorkshopItem(
itemId: string,
result: gdjs.Variable
): gdjs.AsyncTask {
if (steamAPI)
return new gdjs.PromiseTask(
steamAPI.workshop
.subscribe(BigInt(itemId))
.then(() => {
result.setBoolean(true);
})
.catch(() => {
result.setBoolean(false);
})
);
else {
result.setBoolean(false);
return new gdjs.ResolveTask();
}
}
export function unsubscribeToWorkshopItem(
itemId: string,
result: gdjs.Variable
): gdjs.AsyncTask {
if (steamAPI)
return new gdjs.PromiseTask(
steamAPI.workshop
.unsubscribe(BigInt(itemId))
.then(() => {
result.setBoolean(true);
})
.catch(() => {
result.setBoolean(false);
})
);
else {
result.setBoolean(false);
return new gdjs.ResolveTask();
}
}
export function startWorkshopDownload(
itemId: string,
highPriority: boolean
): void {
if (steamAPI) steamAPI.workshop.download(BigInt(itemId), highPriority);
}
enum WorkshopItemStates {
None = 0,
Subscribed = 1,
LegacyItem = 2,
Installed = 4,
NeedsUpdate = 8,
Downloading = 16,
DownloadPending = 32,
}
export function workshopItemState(
itemId: string,
state: keyof WorkshopItemStates
): boolean {
return (
!!steamAPI &&
(steamAPI.workshop.state(BigInt(itemId)) &
WorkshopItemStates[state]) !==
0
);
}
export function getWorkshopItemLocation(itemId: string): string {
return steamAPI
? steamAPI.workshop.installInfo(BigInt(itemId))?.folder || ''
: '';
}
export function getWorkshopItemSizeOnDisk(itemId: string): number {
return steamAPI
? Number(steamAPI.workshop.installInfo(BigInt(itemId))?.sizeOnDisk) || 0
: 0;
}
export function getWorkshopItemInstallTimestamp(itemId: string): number {
return steamAPI
? steamAPI.workshop.installInfo(BigInt(itemId))?.timestamp || 0
: 0;
}
export function getWorkshopItemDownloadProgress(itemId: string): number {
return steamAPI
? Number(steamAPI.workshop.downloadInfo(BigInt(itemId))?.current) || 0
: 0;
}
export function getWorkshopItemDownloadTotal(itemId: string): number {
return steamAPI
? Number(steamAPI.workshop.downloadInfo(BigInt(itemId))?.total) || 0
: 0;
}
}
}

View File

@@ -1,362 +0,0 @@
declare module 'steamworks.js/client' {
export function init(appId: number): void;
export function restartAppIfNecessary(appId: number): boolean;
export function runCallbacks(): void;
export interface PlayerSteamId {
steamId64: bigint;
steamId32: string;
accountId: number;
}
export namespace achievement {
export function activate(achievement: string): boolean;
export function isActivated(achievement: string): boolean;
export function clear(achievement: string): boolean;
}
export namespace apps {
export function isSubscribedApp(appId: number): boolean;
export function isAppInstalled(appId: number): boolean;
export function isDlcInstalled(appId: number): boolean;
export function isSubscribedFromFreeWeekend(): boolean;
export function isVacBanned(): boolean;
export function isCybercafe(): boolean;
export function isLowViolence(): boolean;
export function isSubscribed(): boolean;
export function appBuildId(): number;
export function appInstallDir(appId: number): string;
export function appOwner(): PlayerSteamId;
export function availableGameLanguages(): Array<string>;
export function currentGameLanguage(): string;
export function currentBetaName(): string | null;
}
export namespace auth {
/** @param timeoutSeconds - The number of seconds to wait for the ticket to be validated. Default value is 10 seconds. */
export function getSessionTicket(
timeoutSeconds?: number | undefined | null
): Promise<Ticket>;
export class Ticket {
cancel(): void;
getBytes(): Buffer;
}
}
export const enum ChatMemberStateChange {
/** This user has joined or is joining the lobby. */
Entered,
/** This user has left or is leaving the lobby. */
Left,
/** User disconnected without leaving the lobby first. */
Disconnected,
/** The user has been kicked. */
Kicked,
/** The user has been kicked and banned. */
Banned,
}
export interface CallbackReturns {
[callback.SteamCallback.PersonaStateChange]: {
steam_id: bigint;
flags: { bits: number };
};
[callback.SteamCallback.SteamServersConnected]: {};
[callback.SteamCallback.SteamServersDisconnected]: {
reason: number;
};
[callback.SteamCallback.SteamServerConnectFailure]: {
reason: number;
still_retrying: boolean;
};
[callback.SteamCallback.LobbyDataUpdate]: {
lobby: bigint;
member: bigint;
success: boolean;
};
[callback.SteamCallback.LobbyChatUpdate]: {
lobby: bigint;
user_changed: bigint;
making_change: bigint;
member_state_change: ChatMemberStateChange;
};
[callback.SteamCallback.P2PSessionRequest]: {
remote: bigint;
};
[callback.SteamCallback.P2PSessionConnectFail]: {
remote: bigint;
error: number;
};
[callback.SteamCallback.GameLobbyJoinRequested]: {
lobby_steam_id: bigint;
friend_steam_id: bigint;
};
[callback.SteamCallback.MicroTxnAuthorizationResponse]: {
app_id: number;
order_id: number | bigint;
authorized: boolean;
};
}
export namespace callback {
export const enum SteamCallback {
PersonaStateChange = 0,
SteamServersConnected = 1,
SteamServersDisconnected = 2,
SteamServerConnectFailure = 3,
LobbyDataUpdate = 4,
LobbyChatUpdate = 5,
P2PSessionRequest = 6,
P2PSessionConnectFail = 7,
GameLobbyJoinRequested = 8,
MicroTxnAuthorizationResponse = 9,
}
export function register<C extends keyof CallbackReturns>(
steamCallback: C,
handler: (value: CallbackReturns[C]) => void
): Handle;
export class Handle {
disconnect(): void;
}
}
export namespace cloud {
export function isEnabledForAccount(): boolean;
export function isEnabledForApp(): boolean;
export function readFile(name: string): string;
export function writeFile(name: string, content: string): boolean;
export function deleteFile(name: string): boolean;
export function fileExists(name: string): boolean;
}
export namespace input {
export interface AnalogActionVector {
x: number;
y: number;
}
export function init(): void;
export function getControllers(): Array<Controller>;
export function getActionSet(actionSetName: string): bigint;
export function getDigitalAction(actionName: string): bigint;
export function getAnalogAction(actionName: string): bigint;
export function shutdown(): void;
export class Controller {
activateActionSet(actionSetHandle: bigint): void;
isDigitalActionPressed(actionHandle: bigint): boolean;
getAnalogActionVector(actionHandle: bigint): AnalogActionVector;
}
}
export namespace localplayer {
export function getSteamId(): PlayerSteamId;
export function getName(): string;
export function getLevel(): number;
/** @returns the 2 digit ISO 3166-1-alpha-2 format country code which client is running in, e.g. "US" or "UK". */
export function getIpCountry(): string;
export function setRichPresence(
key: string,
value?: string | undefined | null
): void;
}
export namespace matchmaking {
export const enum LobbyType {
Private = 0,
FriendsOnly = 1,
Public = 2,
Invisible = 3,
}
export function createLobby(
lobbyType: LobbyType,
maxMembers: number
): Promise<Lobby>;
export function joinLobby(lobbyId: bigint): Promise<Lobby>;
export function getLobbies(): Promise<Array<Lobby>>;
export class Lobby {
id: bigint;
join(): Promise<Lobby>;
leave(): void;
openInviteDialog(): void;
getMemberCount(): bigint;
getMemberLimit(): bigint | null;
getMembers(): Array<PlayerSteamId>;
getOwner(): PlayerSteamId;
setJoinable(joinable: boolean): boolean;
getData(key: string): string | null;
setData(key: string, value: string): boolean;
deleteData(key: string): boolean;
/** Get an object containing all the lobby data */
getFullData(): Record<string, string>;
/**
* Merge current lobby data with provided data in a single batch
* @returns true if all data was set successfully
*/
mergeFullData(data: Record<string, string>): boolean;
}
}
export namespace networking {
export interface P2PPacket {
data: Buffer;
size: number;
steamId: PlayerSteamId;
}
/** The method used to send a packet */
export const enum SendType {
/**
* Send the packet directly over udp.
*
* Can't be larger than 1200 bytes
*/
Unreliable = 0,
/**
* Like `Unreliable` but doesn't buffer packets
* sent before the connection has started.
*/
UnreliableNoDelay = 1,
/**
* Reliable packet sending.
*
* Can't be larger than 1 megabyte.
*/
Reliable = 2,
/**
* Like `Reliable` but applies the nagle
* algorithm to packets being sent
*/
ReliableWithBuffering = 3,
}
export function sendP2PPacket(
steamId64: bigint,
sendType: SendType,
data: Buffer
): boolean;
export function isP2PPacketAvailable(): number;
export function readP2PPacket(size: number): P2PPacket;
export function acceptP2PSession(steamId64: bigint): void;
}
export namespace overlay {
export const enum Dialog {
Friends = 0,
Community = 1,
Players = 2,
Settings = 3,
OfficialGameGroup = 4,
Stats = 5,
Achievements = 6,
}
export const enum StoreFlag {
None = 0,
AddToCart = 1,
AddToCartAndShow = 2,
}
export function activateDialog(dialog: Dialog): void;
export function activateDialogToUser(
dialog: Dialog,
steamId64: bigint
): void;
export function activateInviteDialog(lobbyId: bigint): void;
export function activateToWebPage(url: string): void;
export function activateToStore(appId: number, flag: StoreFlag): void;
}
export namespace stats {
export function getInt(name: string): number | null;
export function setInt(name: string, value: number): boolean;
export function store(): boolean;
export function resetAll(achievementsToo: boolean): boolean;
}
export namespace utils {
export function getAppId(): number;
export function getServerRealTime(): number;
export function isSteamRunningOnSteamDeck(): boolean;
}
export namespace workshop {
export interface UgcResult {
itemId: bigint;
needsToAcceptAgreement: boolean;
}
export const enum UgcItemVisibility {
Public = 0,
FriendsOnly = 1,
Private = 2,
Unlisted = 3,
}
export interface UgcUpdate {
title?: string;
description?: string;
changeNote?: string;
previewPath?: string;
contentPath?: string;
tags?: Array<string>;
visibility?: UgcItemVisibility;
}
export interface InstallInfo {
folder: string;
sizeOnDisk: bigint;
timestamp: number;
}
export interface DownloadInfo {
current: bigint;
total: bigint;
}
export function createItem(
appId?: number | undefined | null
): Promise<UgcResult>;
export function updateItem(
itemId: bigint,
updateDetails: UgcUpdate,
appId?: number | undefined | null
): Promise<UgcResult>;
/**
* Subscribe to a workshop item. It will be downloaded and installed as soon as possible.
*
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#SubscribeItem}
*/
export function subscribe(itemId: bigint): Promise<void>;
/**
* Unsubscribe from a workshop item. This will result in the item being removed after the game quits.
*
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#UnsubscribeItem}
*/
export function unsubscribe(itemId: bigint): Promise<void>;
/**
* Gets the current state of a workshop item on this client. States can be combined.
*
* @returns a number with the current item state, e.g. 9
* 9 = 1 (The current user is subscribed to this item) + 8 (The item needs an update)
*
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#GetItemState}
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#EItemState}
*/
export function state(itemId: bigint): number;
/**
* Gets info about currently installed content on the disc for workshop item.
*
* @returns an object with the the properties {folder, size_on_disk, timestamp}
*
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#GetItemInstallInfo}
*/
export function installInfo(itemId: bigint): InstallInfo | null;
/**
* Get info about a pending download of a workshop item.
*
* @returns an object with the properties {current, total}
*
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#GetItemDownloadInfo}
*/
export function downloadInfo(itemId: bigint): DownloadInfo | null;
/**
* Download or update a workshop item.
*
* @param highPriority - If high priority is true, start the download in high priority mode, pausing any existing in-progress Steam downloads and immediately begin downloading this workshop item.
* @returns true or false
*
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#DownloadItem}
*/
export function download(itemId: bigint, highPriority: boolean): boolean;
}
}
declare module 'steamworks.js' {
export function init(appId?: number): Client;
export function restartAppIfNecessary(appId: number): boolean;
export function electronEnableSteamOverlay(
disableEachFrameInvalidation?: boolean
): void;
export type Client = Omit<
typeof import('steamworks.js/client'),
'init' | 'runCallbacks'
>;
export const SteamCallback: typeof import('steamworks.js/client').callback.SteamCallback;
}

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="10mm"
height="10mm"
viewBox="0 0 210 297"
version="1.1"
id="svg1042"
sodipodi:docname="steam.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview11"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="32"
inkscape:cx="13.375"
inkscape:cy="19.671875"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="svg1042" />
<defs
id="defs1039">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath443">
<path
d="m 42.739,391.343 h 30.117 v 28.885 H 42.739 Z"
id="path441" />
</clipPath>
</defs>
<ellipse
style="fill:#ffffff;stroke-width:7.68645;fill-opacity:1"
id="path35"
cy="148.67365"
cx="98.748901"
rx="142.2489"
ry="148.32635"
inkscape:label="arthuro was here (and added this white circle). congrats if you are finding this cool easter egg." />
<g
id="layer1">
<g
id="g437"
transform="matrix(9.8615397,0,0,-10.282153,-194.26604,4737.3625)">
<g
id="g439"
clip-path="url(#clipPath443)"
transform="translate(-27.450714,40.508429)">
<g
id="g445"
transform="translate(59.633,411.0144)">
<path
d="m 0,0 c -0.299,-0.449 -0.459,-0.976 -0.458,-1.516 0.001,-0.722 0.289,-1.415 0.8,-1.926 0.511,-0.51 1.204,-0.797 1.927,-0.797 0.539,0 1.066,0.16 1.515,0.46 0.448,0.299 0.798,0.725 1.004,1.224 0.206,0.498 0.26,1.047 0.155,1.576 C 4.837,-0.45 4.577,0.035 4.196,0.417 3.814,0.798 3.328,1.057 2.799,1.162 2.27,1.267 1.721,1.212 1.223,1.006 0.725,0.799 0.299,0.449 0,0 M 5.281,0.501 C 5.68,-0.096 5.892,-0.798 5.892,-1.516 5.889,-2.477 5.506,-3.398 4.826,-4.078 4.145,-4.758 3.224,-5.14 2.262,-5.142 c -0.718,0 -1.419,0.213 -2.016,0.612 -0.597,0.399 -1.062,0.966 -1.337,1.629 -0.274,0.664 -0.346,1.394 -0.206,2.098 0.14,0.704 0.486,1.35 0.994,1.858 C 0.205,1.562 0.852,1.908 1.556,2.047 2.26,2.187 2.99,2.115 3.653,1.839 4.316,1.564 4.883,1.099 5.281,0.501 m -13.124,-13.202 -1.777,0.735 c 0.258,-0.538 0.667,-0.988 1.176,-1.297 0.51,-0.309 1.098,-0.463 1.694,-0.443 0.595,0.02 1.172,0.212 1.66,0.555 0.488,0.342 0.865,0.819 1.086,1.372 0.222,0.553 0.277,1.159 0.16,1.743 -0.117,0.584 -0.402,1.122 -0.819,1.547 -0.418,0.425 -0.95,0.719 -1.532,0.847 -0.582,0.128 -1.189,0.083 -1.746,-0.128 l 1.833,-0.76 c 0.538,-0.24 0.961,-0.681 1.178,-1.228 0.218,-0.548 0.212,-1.158 -0.014,-1.702 -0.226,-0.544 -0.656,-0.977 -1.198,-1.209 -0.541,-0.231 -1.152,-0.241 -1.701,-0.029 z M 11.842,5.103 h -0.257 v 0.459 h 0.26 c 0.2,0 0.269,-0.089 0.269,-0.218 0,-0.034 -0.008,-0.068 -0.022,-0.099 C 12.077,5.214 12.057,5.186 12.031,5.164 12.005,5.141 11.975,5.124 11.943,5.113 11.91,5.103 11.876,5.099 11.842,5.103 m 0.491,0.244 c 0,0.199 -0.108,0.389 -0.478,0.389 H 11.373 V 4.352 h 0.203 V 4.9 h 0.298 l 0.278,-0.548 h 0.247 l -0.316,0.612 c 0.074,0.032 0.137,0.086 0.182,0.154 0.044,0.068 0.068,0.148 0.068,0.229 M 10.862,4.367 C 10.73,4.56 10.658,4.787 10.654,5.021 h -0.012 c -0.006,0.159 0.02,0.317 0.078,0.465 0.058,0.149 0.146,0.283 0.258,0.396 0.113,0.113 0.247,0.201 0.395,0.259 0.148,0.059 0.307,0.086 0.466,0.08 0.233,0 0.462,-0.069 0.656,-0.199 C 12.69,5.893 12.841,5.709 12.931,5.493 13.022,5.278 13.046,5.04 13.002,4.811 12.957,4.582 12.846,4.371 12.682,4.205 12.518,4.038 12.308,3.924 12.079,3.877 11.851,3.829 11.613,3.851 11.396,3.938 11.18,4.025 10.994,4.174 10.862,4.367 m 2.132,-0.121 c 0.154,0.229 0.237,0.499 0.238,0.775 0.006,0.185 -0.026,0.369 -0.094,0.541 -0.068,0.172 -0.17,0.329 -0.301,0.46 -0.13,0.131 -0.286,0.234 -0.458,0.304 -0.171,0.069 -0.355,0.102 -0.54,0.098 -0.276,0 -0.546,-0.081 -0.776,-0.234 C 10.833,6.037 10.653,5.82 10.547,5.565 10.441,5.31 10.412,5.03 10.465,4.759 c 0.053,-0.271 0.185,-0.52 0.38,-0.716 0.194,-0.196 0.443,-0.33 0.713,-0.385 0.271,-0.055 0.552,-0.028 0.807,0.077 0.255,0.104 0.474,0.282 0.629,0.511 m -25.289,1.137 c 2.667,2.462 6.162,3.829 9.791,3.831 L -2.497,9.191 C 0.19,9.192 2.824,8.443 5.108,7.028 7.393,5.614 9.238,3.59 10.435,1.184 c 1.197,-2.406 1.699,-5.098 1.45,-7.773 -0.25,-2.676 -1.24,-5.229 -2.861,-7.372 -1.621,-2.143 -3.808,-3.791 -6.315,-4.759 -2.507,-0.969 -5.234,-1.218 -7.874,-0.721 -2.641,0.497 -5.091,1.721 -7.074,3.535 -1.983,1.813 -3.421,4.144 -4.151,6.73 l 5.535,-2.29 c 0.202,-0.992 0.766,-1.874 1.581,-2.475 0.815,-0.6 1.824,-0.877 2.831,-0.777 1.008,0.101 1.942,0.572 2.622,1.321 0.681,0.75 1.059,1.726 1.061,2.739 v 0.193 l 4.908,3.502 h 0.114 c 1.078,0 2.131,0.32 3.026,0.918 0.896,0.599 1.594,1.45 2.007,2.445 0.412,0.995 0.52,2.09 0.31,3.147 C 7.394,0.604 6.876,1.574 6.114,2.336 5.352,3.098 4.382,3.616 3.325,3.827 2.268,4.037 1.173,3.929 0.178,3.517 -0.817,3.104 -1.668,2.406 -2.267,1.51 -2.865,0.615 -3.185,-0.438 -3.185,-1.516 V -1.573 L -6.627,-6.56 h -0.228 c -0.821,0 -1.623,-0.248 -2.299,-0.713 l -7.74,3.202 c 0.291,3.617 1.933,6.993 4.599,9.454"
style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path447" />
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -1,12 +1,12 @@
{
"name": "gdevelop",
"version": "5.1.164",
"version": "5.0.139",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "gdevelop",
"version": "5.1.164",
"version": "5.0.139",
"license": "MIT",
"dependencies": {
"@electron/remote": "^2.0.8",
@@ -26,7 +26,6 @@
"lodash.debounce": "^4.0.8",
"lodash.throttle": "^4.1.1",
"minimist": "^1.2.3",
"steamworks.js": "^0.2.0",
"ws": "^5.1.1"
}
},
@@ -139,7 +138,8 @@
"node_modules/@types/node": {
"version": "16.11.47",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.47.tgz",
"integrity": "sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g=="
"integrity": "sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g==",
"peer": true
},
"node_modules/@types/semver": {
"version": "6.2.0",
@@ -4325,17 +4325,6 @@
"node": ">= 0.6"
}
},
"node_modules/steamworks.js": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/steamworks.js/-/steamworks.js-0.2.0.tgz",
"integrity": "sha512-24NFONmtetpZKsdy1SOGZtox7WbmFApzykkW4g53ecB2pnf1AeBuBSB2jGMhK5lG1rgKdmwlbRp1f6P1g7Hk2Q==",
"dependencies": {
"@types/node": "*"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/stream-combiner": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
@@ -4902,7 +4891,8 @@
"@types/node": {
"version": "16.11.47",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.47.tgz",
"integrity": "sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g=="
"integrity": "sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g==",
"peer": true
},
"@types/semver": {
"version": "6.2.0",
@@ -8250,14 +8240,6 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
},
"steamworks.js": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/steamworks.js/-/steamworks.js-0.2.0.tgz",
"integrity": "sha512-24NFONmtetpZKsdy1SOGZtox7WbmFApzykkW4g53ecB2pnf1AeBuBSB2jGMhK5lG1rgKdmwlbRp1f6P1g7Hk2Q==",
"requires": {
"@types/node": "*"
}
},
"stream-combiner": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",

View File

@@ -25,7 +25,6 @@
"lodash.debounce": "^4.0.8",
"lodash.throttle": "^4.1.1",
"minimist": "^1.2.3",
"steamworks.js": "0.2.0",
"ws": "^5.1.1"
}
}