- 마지막 업데이트
외부플랫폼연동모듈 레퍼런스 — Native
SDK 버전 1.0.0 기준이에요. 항목 35개를 이름순으로 모은 통합 문서예요.
Contents
기본 연동 안내
종류 연동 안내 · 모듈 APIModule · 버전 1.0.0
Description
APIModule(외부플랫폼연동모듈)은 스팀 런처로 실행된 게임이 스토브 런처로 실행한 것과 똑같이 스토브 플랫폼 기능을 쓸 수 있도록 이어 주는 모듈이에요. 스팀에서 인증된 사용자 정보로 스토브 플랫폼 인증을 처리하고, 게임 진입에 필요한 토큰과 회원 정보를 확보하는 시점까지가 이 모듈의 역할이에요.
지원 플랫폼은 스팀(Steam) 하나예요. 다른 외부 플랫폼은 제공하지 않아요. 이 모듈은 Steamworks SDK 를 포함하지 않으며, 게임이 Steamworks SDK 를 이미 연동하고 초기화해 두었다는 것을 전제로 동작해요.
사용자에게 보여 줄 화면(약관 동의 · 접속 불가 안내 · 제재 안내 · 점검 안내 · 오류 팝업)은 모두 개발사가 구현해요. 모듈은 화면에 넣을 값과 결과 코드만 제공해요.
이 모듈은 이전 자료에서 다른 이름으로 불린 적이 있어요. 모두 같은 모듈이며, 현재 명칭은 APIModule 이에요.
헤더 구성
배포 바이너리는 APIModule.dll 이고, 공개 헤더는 4종이에요. 함수를 쓰려면 api_module.h 를, C 환경에서 인터페이스 멤버에 접근하려면 api_module_flat.h 를 함께 포함해요.
| File | Role |
|---|---|
api_module.h | SDK 자유 함수 (Stove_APIModule_*) 선언 |
api_module_types.h | C++ 환경: IModule* 인터페이스 정의(순수 가상 함수). C 환경: 불투명 typedef struct |
api_module_flat.h | 인터페이스 멤버에 대한 C flat 접근자 (Stove_IModule<Interface>_<Method>) |
api_module_misc.h | 열거형 정의 (TypeKind · MethodCode · 결과 코드) |
Declaration Forms
인터페이스 멤버는 C++ 가상 함수와 C flat 접근자 두 가지 형태로 제공되며, 동작은 같아요. flat 접근자는 내부에서 같은 이름의 가상 함수를 호출해요.
C++ 을 쓸 수 있는 개발 환경이라면 C++ 가상 함수 형태를 쓰는 편이 편리해요. 코드가 짧고 형 변환도 줄어들어요. C flat 접근자는 C++ 문법을 쓸 수 없는 개발 환경에서 연동하려고 마련한 것이며, Steamworks SDK 가 C++ 인터페이스와 별도로 C 헤더를 제공하는 것과 같은 목적이에요.
| Target | Notation |
|---|---|
SDK API 함수 (Stove_APIModule_Initialize 등) | C flat 함수 (자유 함수, C/C++ 동일 시그니처) |
인터페이스 멤버 (GetAccessToken 등) | C++ 가상 함수 + C flat 접근자 |
| 콜백 | 콜백 typedef |
- 모든 공개 함수는
extern "C"+__cdecl로 공개돼요. 32비트 빌드에서 호출 규약이 어긋나면 스택이 깨지므로, 함수 포인터를 직접 선언할 때도__cdecl을 지켜야 해요. - 헤더는 이 호출 규약을
STOVE_MODULE_API매크로로 표기해요. MSVC 에서는__cdecl로, 그 밖의 컴파일러에서는 빈 문자열로 정의돼요. 이 문서의 선언은 헤더 표기를 그대로 옮겼고, 예제 코드에서 게임이 정의하는 콜백 함수는__cdecl로 적었어요. 두 표기는 MSVC 에서 같은 뜻이에요. - 헤더에는 각 flat 함수의 함수 포인터 typedef(
<함수명>_t)도 함께 선언되어 있지만 이 문서에서는 표기하지 않아요. 동적 로딩(GetProcAddress) 용도로 필요할 때만 참고하세요.
각 함수 문서의 ## Example 은 두 형태를 C · C++ 탭으로 나란히 싣어요. 같은 API 를 어느 쪽으로 호출해도 결과가 같으므로 프로젝트 환경에 맞는 탭 하나만 보면 돼요.
| Tab | 쓰는 곳 | 인터페이스 멤버 접근 | 객체 해제 |
|---|---|---|---|
C | C 프로젝트, 또는 가상 함수 호출을 피하는 C++ 프로젝트 | Stove_IModuleAPIResult_IsSuccessful(result) | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param) |
C++ | api_module_types.h 의 인터페이스를 그대로 쓰는 C++ 프로젝트 | result->IsSuccessful() | param->Destroy() |
SDK 함수(Stove_APIModule_*)는 두 탭에서 같아요. 달라지는 것은 인터페이스 멤버 접근과 해제 표기뿐이에요. 여기서 말하는 C++ 는 신규 인터페이스를 C++ 문법으로 호출하는 것이며, PCSDK3 의 구 C++ 인터페이스(Stove::PCSDK::<Module>)와는 달라요.
Naming Rules
| Category | Pattern | Example |
|---|---|---|
| SDK 함수 | Stove_APIModule_<Method> | Stove_APIModule_Initialize, Stove_APIModule_GameCheckerForSteam |
| 파라미터 객체 팩토리 | Stove_APIModule_CreateParam(kind) | Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam) |
| 인터페이스 | IModule<Name> | IModuleGameCheckerForSteamOutcome |
| 인터페이스 접근자 | Stove_IModule<Name>_<Method> | Stove_IModuleGameCheckerForSteamOutcome_GetAccessToken(outcome) |
| 콜백 타입 | OnAPIModule<Action>Callback | OnAPIModuleGameCheckerForSteamCallback |
| 열거값 | k_E<Enum>_<Value> | k_EStoveModuleCommonResultCode_Success |
종료 함수는
Stove_APIModule_UnInitialize예요. 대문자I에 주의하세요.
Memory Lifetime
모든 SDK 오브젝트는 IModuleTypeBase 를 뿌리로 하며, ShouldDestroy() 플래그로 해제 책임이 정해져요.
일반 규칙 — 출처를 외울 필요 없이 아래 한 줄로 판단할 수 있어요.
cif (Stove_IModuleTypeBase_ShouldDestroy(obj)) // C++ 에서는 obj->ShouldDestroy() Stove_IModuleTypeBase_Destroy(obj); // C++ 에서는 obj->Destroy()
| Creation Path | ShouldDestroy | Release |
|---|---|---|
Stove_APIModule_CreateParam() 로 만든 파라미터 객체 | true | 호출자가 반드시 해제 — API 호출이 끝난 뒤 Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param) |
동기 함수가 반환한 IModuleAPIResult* | true | 호출자가 반드시 해제 — 결과 코드를 확인한 뒤 Stove_IModuleTypeBase_Destroy() |
out 파라미터로 받은 객체 (IModuleStoveGDSInfo**) | true | 호출자가 반드시 해제 |
콜백 인자 IModuleAPICallbackResult* 와 IModuleXxxOutcome* | false | SDK 소유 — 해제 금지. 콜백이 반환되는 순간 소멸해요 |
결과 객체의 Getter 로 얻은 하위 객체 (GetMember(), GetUser() 등) | false | 부모 객체가 소유 — 해제 금지 |
콜백 인자로 받은 객체와 그 하위 객체는 콜백이 반환되는 즉시 무효가 돼요. 콜백 밖에서 써야 하는 값은 콜백 안에서 깊은 복사해 두세요. 문자열은
const wchar_t*포인터만 넘어오므로 포인터를 보관하면 댕글링 포인터가 되어서 크래시의 원인이 될 수 있어요.
파라미터 객체는 API 에 넘긴 뒤에도 소유권이 호출자에게 남아요. 비동기 함수라도 함수가 반환한 뒤 바로 해제할 수 있어요. SDK 는 필요한 값을 호출 시점에 복사해요.
Initialization Order
- Steamworks 에서 스팀 세션 토큰을 발급받아요 (
ISteamUser::GetAuthTicketForWebApi, 결과는GetTicketForWebApiResponse_t콜백으로 와요). 프로세스당 한 번 받아 게임 세션 동안 재사용하는 값이므로, 받은 값을 보관해 두고 이후 호출에 그대로 넣어요. Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_APIInitializeParam)로IModuleAPIInitializeParam을 만들고 실행 환경 · 플랫폼 이름(L"STEAM"고정) · 스팀 앱 ID · 스팀 사용자 ID 를 설정해요.Stove_APIModule_Initialize(param, onFinished, userData)를 호출해요. 비동기이므로 결과는 콜백으로 와요. 호출 뒤 파라미터 객체를 해제해요.- 게임 메인 루프에서 매 프레임
Stove_APIModule_RunCallback()을 호출하기 시작해요. 이 함수를 돌리지 않으면 3번의 콜백이 오지 않아 연동이 진행되지 않아요. - 초기화 성공 콜백을 받은 뒤 Stove_APIModule_GameCheckerForSteam 을 호출해요. 로그인(인증)과 게임 진입 체크를 겸하는 단일 진입점이에요.
- 콜백에서 결과에 따라 분기해요.
- 성공 — 게임 진입이 가능한 상태예요. 이어서 PCSDK3 를 기동해요.
406401(약관 동의 필요) —Stove_APIModule_FetchGameTermsForSteam()으로 약관을 조회하고, 개발사 화면으로 동의를 받은 뒤Stove_APIModule_AgreeToGameTermsForSteam()으로 제출한 다음 5번을 다시 호출해요.- 그 밖의 실패 — 개발사 안내 화면을 띄운 뒤 게임을 종료해요.
- 게임이 실행되는 동안
Stove_APIModule_RunCallback()루프를 계속 유지해요. - 게임 종료 시
Stove_APIModule_UnInitialize()를 호출해요. 동기 함수이며 반환된IModuleAPIResult*는 호출자가 해제해요.
게임 진입 체크를 다시 호출하는 경우는
406401하나뿐이에요. 약관 동의가 서버에 반영되고 나면 이후 호출에서406401이 다시 나오지 않아요.
PCSDK3 와의 관계
게임 진입 체크가 성공하면 APIModule 이 로그인 상태를 PCSDK3 쪽으로 직접 이어 줘요. 개발사가 토큰을 꺼내 PCSDK3 에 전달하는 절차는 없어요.
개발사가 할 일은 게임 진입 체크 성공 뒤에 평소대로 PCSDK3 를 기동하는 것뿐이에요. 이 시점부터는 스토브 런처로 실행한 경우와 동작이 같아요.
Callback Execution Rules
- 모든 비동기 API 의 콜백은
__cdecl호출 규약을 써요. 헤더의 콜백 typedef 에는 이 규약이STOVE_MODULE_API매크로로 적혀 있어요. - 콜백은 SDK 내부 스레드가 아니라
Stove_APIModule_RunCallback()을 호출한 스레드에서 실행돼요. 이 함수는 게임 UI(메인) 스레드에서 호출해야 해요. 그러면 콜백 안에서 게임 UI 를 바로 다룰 수 있고 별도의 동기화가 필요 없어요. Stove_APIModule_RunCallback()을 호출하지 않으면 콜백은 영원히 오지 않아요. 비동기 함수를 호출하기 전부터 루프를 돌리세요.- 콜백 인자로 받은
IModuleAPICallbackResult*와IModuleXxxOutcome*은 콜백이 실행되는 동안에만 유효해요.Destroy()를 호출하지 마세요. - 콜백은
void* userData를 직접 받지 않아요. 호출할 때 넘긴 값은Stove_IModuleAPICallbackResult_GetUserData(callbackResult)로 꺼내요. userData는 SDK 가 관리하지 않는void*이에요. 스택 변수나 임시 객체를 가리키면 콜백 시점에 댕글링 포인터가 되어서 크래시의 원인이 될 수 있어요. 쓰지 않으면NULL을 넘기세요.onFinished에NULL을 넘기면 요청은 나가지만 결과를 받을 방법이 없어요. 항상 콜백을 지정하세요.
Common Interface
모든 API 가 공유하는 타입이에요.
| Type | Content |
|---|---|
IModuleTypeBase | 모든 SDK 오브젝트의 최상위 인터페이스예요. GetTypeKind() · ShouldDestroy() · Destroy() · QueryExt() 를 제공해요 |
IModuleAPIResult | 동기 함수의 반환값이에요. GetSDKName() · GetMethodCode() · GetResultCode() · IsSuccessful() 을 제공해요 |
IModuleAPICallbackResult | 비동기 콜백의 첫 번째 인자예요. GetResult() · GetErrorMsg() · GetExternalError() · GetUserData() 를 제공해요 |
서버가 내려주는 API 별 코드(예: 게임 진입 체크의
406401)는GetResultCode()가 아니라GetExternalError()로 전달돼요.GetResultCode()에는EStoveModuleCommonResultCode값(성공0, 서버 응답 실패1, HTTP 실패21등)이 담겨요. 두 값을 함께 봐야 실패 원인을 정확히 알 수 있어요.
Notes
- 안내 화면에 쓸 문구를 개발사가 전부 만들어야 하는 것은 아니에요. 게임 진입 체크가 제재(
403201) · 점검(503100) 으로 실패하면 결과 객체에 안내 문구가 담겨 오고, 약관 동의 필요(406401) 는 약관 조회를 한 번 더 호출하면 제목과 본문을 받아요. 받은 값은 그대로 화면에 보여 주세요. 그 밖의 실패 코드는 부가 정보 없이 코드만 오므로 문구를 개발사가 정해요. - 지원 플랫폼은 스팀 하나예요. 초기화 파라미터의 플랫폼 이름은
L"STEAM"고정값이에요. - Steamworks SDK 연동과 스팀 세션 토큰 발급은 개발사 몫이에요. 이 모듈은 Steamworks SDK 를 포함하지 않아요.
- 스팀 세션 토큰은 프로세스당 한 번 발급받아 게임 세션 동안 재사용해요. 게임 진입 체크 · 약관 동의 · 재호출 모두 같은 값을 써요.
- 계정 유형(
AccountType)에 따라 연동 절차가 달라지지 않아요. 게임 진입 체크 동선에서 계정 유형을 구분해 처리할 필요가 없어요. - 언어 설정(
Stove_APIModule_SetLanguage)은 BCP 47 형식 문자열을 받아요. 예:L"ko",L"en",L"ja". - 결과 객체의 하위 객체(
GetRestrictInfo()·GetMaintenanceInfo())는 해당 상황이 아닐 때 값이 비어 있는 객체로 전달돼요. 값을 읽기 전에 널 검사를 함께 해 두는 편이 안전해요.
See Also
| Document | Content |
|---|---|
| Stove_APIModule_GameCheckerForSteam | 로그인과 게임 진입 체크를 겸하는 단일 진입점 |
| IModuleGameCheckerForSteamOutcome | 게임 진입 체크 결과 데이터 |
| EStoveGameCheckerForSteamResultCode | 게임 진입 체크 결과 코드 |
| 기본 연동 안내 (C#) | 같은 내용의 C# 판 |
EStoveAgreeToGameTermsForSteamResultCode
종류 결과코드 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_AgreeToGameTermsForSteam 전용 결과 코드예요. 값은 스토브 백엔드가 내려주는 응답 코드를 그대로 옮긴 것이며, 성공은 0 이에요.
이 값은 콜백 인자에서 Stove_IModuleAPICallbackResult_GetExternalError() 로 꺼내요. Stove_IModuleAPIResult_GetResultCode() 에는 이 값이 아니라 EStoveModuleCommonResultCode 값(성공 0, 서버 응답 실패 1, HTTP 실패 21 등)이 담겨요. 두 값을 함께 봐야 실패 원인을 정확히 알 수 있어요.
값은 HTTP 상태 코드 계열로 묶여 있어요. 4xxxxx 는 요청 · 권한 · 데이터 문제, 5xxxxx 는 서버 문제예요. 49500 만 이 규칙에서 벗어난 접속 차단 전용 코드예요.
동의 제출이 성공해야 게임 진입 체크를 다시 호출할 수 있어요. 실패하면 안내 화면을 띄운 뒤 게임을 종료해요. 동의를 받지 못한 상태로 게임 진입 체크를 다시 호출하면 다시 406401 로 실패해요.
Declaration
typedef enum EStoveAgreeToGameTermsForSteamResultCode
{
k_EStoveAgreeToGameTermsForSteamResultCode_Success = 0,
k_EStoveAgreeToGameTermsForSteamResultCode_BlockedIP = 49500,
k_EStoveAgreeToGameTermsForSteamResultCode_BadRequest = 400000,
k_EStoveAgreeToGameTermsForSteamResultCode_InvalidProvider = 401000,
k_EStoveAgreeToGameTermsForSteamResultCode_GameDataNotFound = 404000,
k_EStoveAgreeToGameTermsForSteamResultCode_GameTermsNotFound = 404200,
k_EStoveAgreeToGameTermsForSteamResultCode_ServerErr = 500000,
k_EStoveAgreeToGameTermsForSteamResultCode_ServerErrCommunication = 500001,
k_EStoveAgreeToGameTermsForSteamResultCode_ServerErrCircuitOpen = 500002,
k_EStoveAgreeToGameTermsForSteamResultCode_Max = 0x7fffffff,
} EStoveAgreeToGameTermsForSteamResultCode;
Enum Values
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveAgreeToGameTermsForSteamResultCode_Success | 동의가 서버에 반영되었어요. 게임 진입 체크를 다시 호출해요. | x | |
| 49500 | k_EStoveAgreeToGameTermsForSteamResultCode_BlockedIP | 접속이 차단된 IP 예요. | O | 접속이 허용되지 않은 IP입니다. 고객센터에 문의해 주세요. 닫기 고객센터 |
| 400000 | k_EStoveAgreeToGameTermsForSteamResultCode_BadRequest | 요청 형식이 잘못되었거나 필수 값이 빠졌어요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 401000 | k_EStoveAgreeToGameTermsForSteamResultCode_InvalidProvider | 지원하지 않는 인증 제공자예요. | O | 접속이 허용되지 않은 IP입니다. 고객센터에 문의해 주세요. 닫기 고객센터 |
| 404000 | k_EStoveAgreeToGameTermsForSteamResultCode_GameDataNotFound | 게임 데이터를 찾을 수 없어요. | O | 게임 정보 확인에 실패하였습니다. 재시도 후, 오류가 계속될 경우 도움말을 확인해 주세요. 도움이 더 필요하신가요? 닫기 도움말 보기 |
| 404200 | k_EStoveAgreeToGameTermsForSteamResultCode_GameTermsNotFound | 이 게임에 등록된 약관을 찾을 수 없어요. | O | 해당 게임의 서비스 이용 약관 정보 조회에 실패하였습니다. 확인 |
| 500000 | k_EStoveAgreeToGameTermsForSteamResultCode_ServerErr | 서버 오류예요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. 재시도 후 오류가 계속될 경우 도움말을 확인해 주세요. 도움이 더 필요하신가요? 닫기 도움말 보기 |
| 500001 | k_EStoveAgreeToGameTermsForSteamResultCode_ServerErrCommunication | 서버 간 통신에 실패했어요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 500002 | k_EStoveAgreeToGameTermsForSteamResultCode_ServerErrCircuitOpen | 서버 회로 차단 상태로 일시적으로 처리할 수 없어요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 0x7fffffff | k_EStoveAgreeToGameTermsForSteamResultCode_Max | 열거형 경계값이에요. 사용하지 않아요. | — |
모든 실패 코드는 안내 화면을 띄운 뒤 게임을 종료해야 해요. 동의가 반영되지 않은 상태에서 게임 진입 체크를 다시 호출하면 같은 자리로 되돌아와요.
Show to User가O인 코드는 게임이 사용자에게 상황을 알리는 화면을 띄워야 하는 코드예요. 화면과 문구는 개발사가 구현해요.
Example
void __cdecl OnAgreeToGameTermsFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleAgreeToGameTermsForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 동의 반영 완료 — 같은 스팀 세션 토큰으로 게임 진입 체크를 다시 호출합니다. */
return;
}
switch (Stove_IModuleAPICallbackResult_GetExternalError(callbackResult))
{
case k_EStoveAgreeToGameTermsForSteamResultCode_BlockedIP:
case k_EStoveAgreeToGameTermsForSteamResultCode_InvalidProvider:
/* 접속 불가 안내 화면을 띄운 뒤 게임 종료 */
break;
case k_EStoveAgreeToGameTermsForSteamResultCode_ServerErr:
case k_EStoveAgreeToGameTermsForSteamResultCode_ServerErrCommunication:
case k_EStoveAgreeToGameTermsForSteamResultCode_ServerErrCircuitOpen:
/* 서버 상태 안내 화면을 띄운 뒤 게임 종료 */
break;
default:
/* 오류 안내 화면을 띄운 뒤 게임 종료 */
break;
}
}
Notes
- 이 코드는
Stove_IModuleAPICallbackResult_GetExternalError()로 전달돼요.Stove_IModuleAPIResult_GetResultCode()와 혼동하지 마세요. - 서버가 함께 내려주는 안내 문구는
Stove_IModuleAPICallbackResult_GetErrorMsg()로 얻어요. - 동의가 성공한 뒤 게임 진입 체크를 다시 호출할 때는 처음 발급받은 스팀 세션 토큰을 그대로 넣어요. 토큰은 프로세스당 한 번 받아 게임 세션 동안 재사용해요.
- 이 목록에 없는 값이
GetExternalError()로 올라올 수 있어요. HTTP 상태 코드가 200 이 아닌데 응답 본문에 코드가 없으면 HTTP 상태 코드가 그대로 전달돼요.switch문에는default분기를 두세요. - 같은 번호를 쓰지만 값 구성이 다른 결과 코드가 API 별로 따로 있어요. 약관 동의에는 게임 진입 체크의
403201·404001·406401·503100이 없어요.
Changelog
| Version | Change |
|---|---|
| 1.0.0 | 최초 제공 |
See Also
- EStoveFetchGameTermsForSteamResultCode
- EStoveGameCheckerForSteamResultCode
- EStoveModuleCommonResultCode
- 기본 연동 안내
EStoveAPIModuleMethodCode
종류 열거형 · 모듈 APIModule · 버전 1.0.0
Description
Stove_IModuleAPIResult_GetMethodCode() 로 읽는 값이에요. 이 결과가 어떤 함수 호출에서 나온 것인지 를 알려 줘요.
콜백 하나로 여러 요청의 결과를 받는 구조를 만들었거나, 오류 로그에 어느 호출이 실패했는지 남기려 할 때 써요. 결과의 성공 · 실패 판단에는 쓰지 않아요.
값은 두 구간으로 나뉘어요. 1~6 은 초기화 · 종료 · 설정 같은 기본 함수, 80 이상은 스팀 연동 동선을 이루는 업무 함수예요.
Declaration
typedef enum EStoveAPIModuleMethodCode
{
k_EStoveAPIModuleMethodCode_Initialize = 1,
// ... 이하 열거값 표 참조
k_EStoveAPIModuleMethodCode_AgreeToGameTermsForSteam = 82,
k_EStoveAPIModuleMethodCode_Max = 0x7fffffff
} EStoveAPIModuleMethodCode;
Enum Values
기본 함수 (1 ~ 6)
| Code | Name | Description |
|---|---|---|
| 1 | k_EStoveAPIModuleMethodCode_Initialize | Stove_APIModule_Initialize |
| 2 | k_EStoveAPIModuleMethodCode_UnInitialize | Stove_APIModule_UnInitialize |
| 3 | k_EStoveAPIModuleMethodCode_GetVersion | Stove_APIModule_GetVersion |
| 4 | k_EStoveAPIModuleMethodCode_RunCallback | Stove_APIModule_RunCallback |
| 5 | k_EStoveAPIModuleMethodCode_SetLanguage | Stove_APIModule_SetLanguage |
| 6 | k_EStoveAPIModuleMethodCode_GetGdsInfo | Stove_APIModule_GetGdsInfo |
| — | 7 ~ 79 | 사용하지 않아요 (예약 구간) |
업무 함수 (80 이상)
| Code | Name | Description |
|---|---|---|
| 80 | k_EStoveAPIModuleMethodCode_GameCheckerForSteam | Stove_APIModule_GameCheckerForSteam |
| 81 | k_EStoveAPIModuleMethodCode_FetchGameTermsForSteam | Stove_APIModule_FetchGameTermsForSteam |
| 82 | k_EStoveAPIModuleMethodCode_AgreeToGameTermsForSteam | Stove_APIModule_AgreeToGameTermsForSteam |
| — | 83 ~ 0x7ffffffe | 사용하지 않아요 (예약 구간) |
| 0x7fffffff | k_EStoveAPIModuleMethodCode_Max | 열거형 경계값이에요. 사용하지 않아요 |
Example
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_GetMethodCode(apiResult)
== k_EStoveAPIModuleMethodCode_GameCheckerForSteam)
{
// 게임 진입 체크 호출에서 나온 결과입니다. 로그 태그 등에 활용합니다.
}
}
Notes
- 열거값 이름은 대응하는 함수 이름과 같은 표기를 써요. 예를 들어
UnInitialize(2)의 대문자I는Stove_APIModule_UnInitialize와 맞춘 것이에요. - 함수 호출이 실패해도 메서드 코드는 그대로 채워져요. 성공 여부는
Stove_IModuleAPIResult_IsSuccessful()로 따로 판단하세요. Stove_IModuleAPIResult_GetMethodCode()의 반환 타입은uint32_t이에요. 열거형과 비교할 때 형 변환 경고가 나면 명시적으로 캐스팅하세요.- 예약 구간의 번호는 앞으로 새 함수가 추가될 자리예요.
switch문에는default분기를 두세요.
Changelog
| Version | Change |
|---|---|
| 1.0.0 | 최초 제공 |
See Also
EStoveAPIModuleTypeKind
종류 열거형 · 모듈 APIModule · 버전 1.0.0
Description
모든 오브젝트가 공통으로 들고 있는 타입 식별값이에요. 쓰임새는 두 가지예요.
- Stove_APIModule_CreateParam(kind) 에 넘겨 어떤 파라미터 객체를 만들지 지정해요.
Stove_IModuleTypeBase_GetTypeKind(obj)로 읽어 손에 든 포인터가 어떤 타입인지 확인해요.
값은 구간으로 나뉘어요. 0~499 는 결과로 받는 데이터 타입, 500 이상은 호출할 때 만들어 넘기는 파라미터 타입이에요.
Stove_APIModule_CreateParam() 이 실제로 객체를 만들어 주는 값은 파라미터 타입 4개뿐이에요. 데이터 타입 값을 넘기면 NULL 이 반환돼요.
Declaration
typedef enum EStoveAPIModuleTypeKind
{
k_EStoveAPIModuleTypeKind_Invalid = -1,
k_EStoveAPIModuleTypeKind_Base = 0,
// ... 이하 열거값 표 참조
k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamParam = 503,
k_EStoveAPIModuleTypeKind_Max = 0x7fffffff,
} EStoveAPIModuleTypeKind;
Enum Values
공통 데이터 타입 (0 ~ 9)
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveAPIModuleTypeKind_Invalid | 타입을 식별할 수 없어요. 정상 오브젝트에서는 나오지 않아요 |
| 0 | k_EStoveAPIModuleTypeKind_Base | IModuleTypeBase — 모든 오브젝트의 최상위 인터페이스 |
| 1 | k_EStoveAPIModuleTypeKind_APIResult | IModuleAPIResult — 동기 함수의 반환값 |
| 2 | k_EStoveAPIModuleTypeKind_APICallbackResult | IModuleAPICallbackResult — 비동기 콜백의 첫 번째 인자 |
| 3 | k_EStoveAPIModuleTypeKind_StoveGDSInfo | IModuleStoveGDSInfo — 국가 · 규제 · 시간대 · 언어 정보 |
| — | 4 ~ 9 | 사용하지 않아요 (예약 구간) |
게임 진입 체크 데이터 타입 (10 ~ 19)
| Code | Name | Description |
|---|---|---|
| 10 | k_EStoveAPIModuleTypeKind_GameCheckerForSteamOutcome | IModuleGameCheckerForSteamOutcome — 게임 진입 체크 결과 |
| 11 | k_EStoveAPIModuleTypeKind_GameCheckerForSteamMember | IModuleGameCheckerForSteamMember — 스토브 회원 정보 |
| 12 | k_EStoveAPIModuleTypeKind_GameCheckerForSteamUser | IModuleGameCheckerForSteamUser — 게임 유저 정보 |
| 13 | k_EStoveAPIModuleTypeKind_GameCheckerForSteamGdsInfo | IModuleGameCheckerForSteamGdsInfo — 게임 진입 체크가 함께 내려주는 지역 정보 |
| 14 | k_EStoveAPIModuleTypeKind_GameCheckerForSteamRestrictInfo | IModuleGameCheckerForSteamRestrictInfo — 제재 정보 |
| 15 | k_EStoveAPIModuleTypeKind_GameCheckerForSteamMaintenanceInfo | IModuleGameCheckerForSteamMaintenanceInfo — 점검 정보 |
| — | 16 ~ 19 | 사용하지 않아요 (예약 구간) |
약관 조회 데이터 타입 (20 ~ 29)
| Code | Name | Description |
|---|---|---|
| 20 | k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamOutcome | IModuleFetchGameTermsForSteamOutcome — 약관 조회 결과 |
| 21 | k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamContent | IModuleFetchGameTermsForSteamContent — 약관 한 건 (조회 결과의 하위 객체) |
| — | 22 ~ 29 | 사용하지 않아요 (예약 구간) |
약관 동의 데이터 타입 (30 ~ 499)
| Code | Name | Description |
|---|---|---|
| 30 | k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamOutcome | IModuleAgreeToGameTermsForSteamOutcome — 약관 동의 결과 |
| — | 31 ~ 499 | 사용하지 않아요 (예약 구간) |
파라미터 타입 (500 이상)
Stove_APIModule_CreateParam() 에 넘길 수 있는 값이에요.
| Code | Name | Description |
|---|---|---|
| 500 | k_EStoveAPIModuleTypeKind_APIInitializeParam | IModuleAPIInitializeParam — 초기화 파라미터 |
| 501 | k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam | IModuleGameCheckerForSteamParam — 게임 진입 체크 파라미터 |
| 502 | k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamParam | IModuleFetchGameTermsForSteamParam — 약관 조회 파라미터 |
| 503 | k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamParam | IModuleAgreeToGameTermsForSteamParam — 약관 동의 파라미터 |
| — | 504 ~ 0x7ffffffe | 사용하지 않아요 (예약 구간) |
| 0x7fffffff | k_EStoveAPIModuleTypeKind_Max | 열거형 경계값이에요. 사용하지 않아요 |
Example
IModuleGameCheckerForSteamParam* param = (IModuleGameCheckerForSteamParam*)
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam);
if (param == NULL)
{
// 지원하지 않는 값을 넘겼거나 생성에 실패한 경우입니다.
return;
}
// 필요하면 타입을 되짚어 확인할 수 있습니다.
if (Stove_IModuleTypeBase_GetTypeKind((IModuleTypeBase*)param)
== k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam)
{
// 예상한 타입입니다.
}
// 호출자가 만든 객체이므로 반드시 해제합니다.
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
Notes
Stove_APIModule_CreateParam()은 파라미터 타입(500이상) 4개만 처리해요. 그 밖의 값을 넘기면NULL을 돌려주므로 반환값의 널 검사를 빠뜨리지 마세요.Stove_APIModule_CreateParam()으로 만든 객체는 호출자 소유예요. API 에 넘긴 뒤Stove_IModuleTypeBase_Destroy()로 해제해야 해요.- 콜백으로 받은 결과 객체와 그 하위 객체는 SDK 소유예요. 타입을 확인하는 용도로
GetTypeKind()를 쓰는 것은 괜찮지만 해제하면 안 돼요. Stove_IModuleTypeBase_GetTypeKind()의 반환 타입은int32_t이에요. 열거형과 비교할 때 형 변환 경고가 나면 명시적으로 캐스팅하세요.- 예약 구간의 번호는 앞으로 새 타입이 추가될 자리예요.
switch문에는default분기를 두세요.
Changelog
| Version | Change |
|---|---|
| 1.0.0 | 최초 제공 |
See Also
EStoveFetchGameTermsForSteamAgType
종류 열거형 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_FetchGameTermsForSteam 을 호출할 때 어떤 동의 동선의 약관을 받을지 지정하는 값이에요. 요청 파라미터의 Stove_IModuleFetchGameTermsForSteamParam_SetAgType() 로 설정해요.
스팀에서 처음 게임에 들어오는 사용자에게 받는 약관과, 기존 계정을 옮겨 오는 사용자에게 받는 약관이 다르기 때문에 구분해요.
값을 설정하지 않으면 0(Default) 이 들어가요. 0 으로 조회해도 스팀 게임 서비스 약관이 내려와요. 기존 계정을 옮겨 오는 동선의 약관이 필요할 때만 2 를 넣으세요.
Declaration
typedef enum EStoveFetchGameTermsForSteamAgType
{
k_EStoveFetchGameTermsForSteamAgType_Default = 0,
k_EStoveFetchGameTermsForSteamAgType_Steam = 1,
k_EStoveFetchGameTermsForSteamAgType_Mig = 2,
k_EStoveFetchGameTermsForSteamAgType_Max = 0x7fffffff,
} EStoveFetchGameTermsForSteamAgType;
Enum Values
| Code | Name | Description |
|---|---|---|
| 0 | k_EStoveFetchGameTermsForSteamAgType_Default | 조회 범위를 따로 지정하지 않아요. 파라미터 객체를 만들었을 때 들어 있는 값이며, 이 값으로 조회하면 서버가 스팀 게임 서비스 약관을 내려줘요 |
| 1 | k_EStoveFetchGameTermsForSteamAgType_Steam | 스팀에서 바로 동의를 받는 동선의 약관을 조회해요 |
| 2 | k_EStoveFetchGameTermsForSteamAgType_Mig | 기존 계정을 옮겨 오는 동선의 약관을 조회해요 |
| — | 3 ~ 0x7ffffffe | 사용하지 않아요 (예약 구간) |
| 0x7fffffff | k_EStoveFetchGameTermsForSteamAgType_Max | 열거형 경계값이에요. 사용하지 않아요 |
Example
IModuleFetchGameTermsForSteamParam* param = (IModuleFetchGameTermsForSteamParam*)
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamParam);
Stove_IModuleFetchGameTermsForSteamParam_SetGameId(param, gameId);
Stove_IModuleFetchGameTermsForSteamParam_SetAgType(param, k_EStoveFetchGameTermsForSteamAgType_Steam);
Stove_APIModule_FetchGameTermsForSteam(param, OnFetchGameTermsFinished, NULL);
// 호출자가 만든 객체이므로 반드시 해제합니다.
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
Notes
- 기본값은
0이에요. 파라미터 객체를 만들면0이 들어 있고, 설정하지 않으면 그대로 요청에 쓰예요.0과1은 모두 스팀 게임 서비스 약관을 받아요. 1과2는 서로 다른 약관 묶음을 가리켜요. 게임이 진행하려는 동선에 맞는 값을 넣어야 사용자에게 보여 줄 약관이 올바르게 내려와요.- 게임 진입 체크가
406401(약관 동의 필요)로 실패해 동의를 받는 일반적인 경우는1(또는 값을 넣지 않은0)이에요.2는 기존 계정을 스팀으로 옮겨 오는 동선에서만 써요. Stove_IModuleFetchGameTermsForSteamParam_SetAgType()의 파라미터 타입은int32_t이에요. 열거형 값을 그대로 넘길 수 있어요.- 정의되지 않은 값을 넣으면
0과 같게 처리돼요.
Changelog
| Version | Change |
|---|---|
| 1.0.0 | 최초 제공 |
See Also
EStoveFetchGameTermsForSteamResultCode
종류 결과코드 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_FetchGameTermsForSteam 전용 결과 코드예요. 값은 스토브 백엔드가 내려주는 응답 코드를 그대로 옮긴 것이며, 성공은 0 이에요.
이 값은 콜백 인자에서 Stove_IModuleAPICallbackResult_GetExternalError() 로 꺼내요. Stove_IModuleAPIResult_GetResultCode() 에는 이 값이 아니라 EStoveModuleCommonResultCode 값(성공 0, 서버 응답 실패 1, HTTP 실패 21 등)이 담겨요. 두 값을 함께 봐야 실패 원인을 정확히 알 수 있어요.
값은 HTTP 상태 코드 계열로 묶여 있어요. 4xxxxx 는 요청 · 데이터 문제, 5xxxxx 는 서버 문제예요.
약관 조회는 게임 진입 체크가 406401(약관 동의 필요)로 실패했을 때 진행하는 동선의 첫 단계예요. 약관 조회가 실패하면 동의를 받을 방법이 없으므로 게임에 들어갈 수 없어요. 안내 화면을 띄운 뒤 게임을 종료해요.
Declaration
typedef enum EStoveFetchGameTermsForSteamResultCode
{
k_EStoveFetchGameTermsForSteamResultCode_Success = 0,
k_EStoveFetchGameTermsForSteamResultCode_BadRequest = 400000,
k_EStoveFetchGameTermsForSteamResultCode_GameDataNotFound = 404000,
k_EStoveFetchGameTermsForSteamResultCode_GameTermsNotFound = 404200,
k_EStoveFetchGameTermsForSteamResultCode_ServerErr = 500000,
k_EStoveFetchGameTermsForSteamResultCode_ServerErrCommunication = 500001,
k_EStoveFetchGameTermsForSteamResultCode_Max = 0x7fffffff,
} EStoveFetchGameTermsForSteamResultCode;
Enum Values
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveFetchGameTermsForSteamResultCode_Success | 약관 목록을 받았어요. 개발사 동의 화면으로 이어 가요. | x | |
| 400000 | k_EStoveFetchGameTermsForSteamResultCode_BadRequest | 요청 형식이 잘못되었거나 필수 값이 빠졌어요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 404000 | k_EStoveFetchGameTermsForSteamResultCode_GameDataNotFound | 게임 데이터를 찾을 수 없어요. | O | 게임 정보 확인에 실패하였습니다. 재시도 후, 오류가 계속될 경우 도움말을 확인해 주세요. 도움이 더 필요하신가요? 닫기 도움말 보기 |
| 404200 | k_EStoveFetchGameTermsForSteamResultCode_GameTermsNotFound | 이 게임에 등록된 약관을 찾을 수 없어요. | O | 해당 게임의 서비스 이용 약관 정보 조회에 실패하였습니다. 확인 |
| 500000 | k_EStoveFetchGameTermsForSteamResultCode_ServerErr | 서버 오류예요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. 재시도 후 오류가 계속될 경우 도움말을 확인해 주세요. 도움이 더 필요하신가요? 닫기 도움말 보기 |
| 500001 | k_EStoveFetchGameTermsForSteamResultCode_ServerErrCommunication | 서버 간 통신에 실패했어요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 0x7fffffff | k_EStoveFetchGameTermsForSteamResultCode_Max | 열거형 경계값이에요. 사용하지 않아요. | — |
모든 실패 코드는 안내 화면을 띄운 뒤 게임을 종료해야 해요. 약관을 받지 못하면 동의를 진행할 수 없고, 동의가 없으면 게임 진입 체크가 계속
406401로 실패해요.
Show to User가O인 코드는 게임이 사용자에게 상황을 알리는 화면을 띄워야 하는 코드예요. 화면과 문구는 개발사가 구현해요.
Example
void __cdecl OnFetchGameTermsFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleFetchGameTermsForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 약관 목록을 개발사 동의 화면에 채워 넣습니다. */
return;
}
switch (Stove_IModuleAPICallbackResult_GetExternalError(callbackResult))
{
case k_EStoveFetchGameTermsForSteamResultCode_GameTermsNotFound:
case k_EStoveFetchGameTermsForSteamResultCode_GameDataNotFound:
/* 약관 정보를 불러올 수 없다는 안내 화면을 띄운 뒤 게임 종료 */
break;
case k_EStoveFetchGameTermsForSteamResultCode_ServerErr:
case k_EStoveFetchGameTermsForSteamResultCode_ServerErrCommunication:
/* 서버 상태 안내 화면을 띄운 뒤 게임 종료 */
break;
default:
/* 오류 안내 화면을 띄운 뒤 게임 종료 */
break;
}
}
Notes
- 이 코드는
Stove_IModuleAPICallbackResult_GetExternalError()로 전달돼요.Stove_IModuleAPIResult_GetResultCode()와 혼동하지 마세요. - 서버가 함께 내려주는 안내 문구는
Stove_IModuleAPICallbackResult_GetErrorMsg()로 얻어요. - 이 목록에 없는 값이
GetExternalError()로 올라올 수 있어요. HTTP 상태 코드가 200 이 아닌데 응답 본문에 코드가 없으면 HTTP 상태 코드가 그대로 전달돼요.switch문에는default분기를 두세요. - 같은 번호를 쓰지만 값 구성이 다른 결과 코드가 API 별로 따로 있어요. 약관 조회에는 게임 진입 체크의
49500·401000·403201·404001·406401·503100과500002가 없어요. - 조회할 약관의 범위는 요청 파라미터의 EStoveFetchGameTermsForSteamAgType 으로 지정해요.
Changelog
| Version | Change |
|---|---|
| 1.0.0 | 최초 제공 |
See Also
- EStoveFetchGameTermsForSteamAgType
- EStoveAgreeToGameTermsForSteamResultCode
- EStoveModuleCommonResultCode
- 기본 연동 안내
EStoveGameCheckerForSteamResultCode
종류 결과코드 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_GameCheckerForSteam 전용 결과 코드예요. 값은 스토브 백엔드가 내려주는 응답 코드를 그대로 옮긴 것이며, 성공은 0 이에요.
이 값은 콜백 인자에서 Stove_IModuleAPICallbackResult_GetExternalError() 로 꺼내요. Stove_IModuleAPIResult_GetResultCode() 에는 이 값이 아니라 EStoveModuleCommonResultCode(성공 0, 서버 응답 실패 1, HTTP 실패 21 등)가 담겨요. 두 값을 함께 봐야 실패 원인을 정확히 알 수 있어요.
값은 HTTP 상태 코드 계열로 묶여 있어요. 4xxxxx 는 요청 · 권한 · 데이터 문제, 5xxxxx 는 서버 문제예요. 49500 만 이 규칙에서 벗어난 접속 차단 전용 코드예요.
게임 진입 체크를 다시 호출하는 경우는 406401(약관 동의 필요) 하나뿐이에요. 나머지 실패는 안내 화면을 띄운 뒤 게임을 종료해요.
Declaration
typedef enum EStoveGameCheckerForSteamResultCode
{
k_EStoveGameCheckerForSteamResultCode_Success = 0,
k_EStoveGameCheckerForSteamResultCode_BlockedIP = 49500,
k_EStoveGameCheckerForSteamResultCode_BadRequest = 400000,
k_EStoveGameCheckerForSteamResultCode_InvalidProvider = 401000,
k_EStoveGameCheckerForSteamResultCode_GameRestrict = 403201,
k_EStoveGameCheckerForSteamResultCode_GameDataNotFound = 404000,
k_EStoveGameCheckerForSteamResultCode_InvalidGameClientKey = 404001,
k_EStoveGameCheckerForSteamResultCode_GameTermsNotFound = 404200,
k_EStoveGameCheckerForSteamResultCode_NotAgreeTerms = 406401,
k_EStoveGameCheckerForSteamResultCode_ServerErr = 500000,
k_EStoveGameCheckerForSteamResultCode_ServerErrCommunication = 500001,
k_EStoveGameCheckerForSteamResultCode_ServerErrCircuitOpen = 500002,
k_EStoveGameCheckerForSteamResultCode_GameServerMaintenance = 503100,
k_EStoveGameCheckerForSteamResultCode_Max = 0x7fffffff,
} EStoveGameCheckerForSteamResultCode;
Enum Values
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveGameCheckerForSteamResultCode_Success | 게임에 진입할 수 있어요. 이어서 PCSDK3 를 기동해요. | x | |
| 49500 | k_EStoveGameCheckerForSteamResultCode_BlockedIP | 접속이 차단된 IP 예요. | O | 접속이 허용되지 않은 IP입니다. 고객센터에 문의해 주세요. 닫기 고객센터 |
| 400000 | k_EStoveGameCheckerForSteamResultCode_BadRequest | 요청 형식이 잘못되었거나 필수 값이 빠졌어요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 401000 | k_EStoveGameCheckerForSteamResultCode_InvalidProvider | 지원하지 않는 인증 제공자예요. | O | 접속이 허용되지 않은 IP입니다. 고객센터에 문의해 주세요. 닫기 고객센터 |
| 403201 | k_EStoveGameCheckerForSteamResultCode_GameRestrict | 게임 이용이 제재된 사용자예요. 제재 내용은 결과 객체의 제재 정보에 담겨요. | O | (API 에서 문구를 전달합니다) |
| 404000 | k_EStoveGameCheckerForSteamResultCode_GameDataNotFound | 게임 데이터를 찾을 수 없어요. | O | 게임 정보 확인에 실패하였습니다. 재시도 후, 오류가 계속될 경우 도움말을 확인해 주세요. 도움이 더 필요하신가요? 닫기 도움말 보기 |
| 404001 | k_EStoveGameCheckerForSteamResultCode_InvalidGameClientKey | 게임 클라이언트 키가 올바르지 않아요. 스토브 플랫폼의 게임 등록 정보 문제이며, 게임이 넘긴 파라미터 문제가 아니에요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 404200 | k_EStoveGameCheckerForSteamResultCode_GameTermsNotFound | 이 게임에 등록된 약관을 찾을 수 없어요. | O | 해당 게임의 서비스 이용 약관 정보 조회에 실패하였습니다. 확인 |
| 406401 | k_EStoveGameCheckerForSteamResultCode_NotAgreeTerms | 필수 게임 약관에 동의하지 않은 사용자예요. 약관 동의 동선을 진행한 뒤 게임 진입 체크를 다시 호출해요. | O | (API 에서 문구를 전달합니다) |
| 500000 | k_EStoveGameCheckerForSteamResultCode_ServerErr | 서버 오류예요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 500001 | k_EStoveGameCheckerForSteamResultCode_ServerErrCommunication | 서버 간 통신에 실패했어요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 500002 | k_EStoveGameCheckerForSteamResultCode_ServerErrCircuitOpen | 서버 회로 차단 상태로 일시적으로 처리할 수 없어요. | O | 일시적인 오류가 발생하였습니다. 잠시 후 다시 시도해 주세요. 확인 |
| 503100 | k_EStoveGameCheckerForSteamResultCode_GameServerMaintenance | 게임 서버가 점검 중이에요. 점검 내용은 결과 객체의 점검 정보에 담겨요. | O | (API 에서 문구를 전달합니다) |
| 0x7fffffff | k_EStoveGameCheckerForSteamResultCode_Max | 열거형 경계값이에요. 사용하지 않아요. | x |
406401을 제외한 모든 실패 코드는 안내 화면을 띄운 뒤 반드시 게임을 종료해야 해요. 게임 진입 체크를 다시 호출해도 같은 결과가 나와요.
403201제재는 결과 객체의 제재 정보(제재 기간 · 사유 · 표시 문구)를 안내 화면에 써요503100점검은 결과 객체의 점검 정보(점검 기간 · 제목 · 본문)를 안내 화면에 써요
Show to User가O인 코드는 게임이 사용자에게 상황을 알리는 화면을 띄워야 하는 코드예요. 화면과 문구는 개발사가 구현해요. 다만403201·503100·406401은 (API 에서 문구를 전달해요).
406401은 오류 안내가 아니라 약관 동의 화면이에요. 다른 코드처럼 안내 후 게임을 종료하는 것이 아니라, 동의를 받아 제출한 뒤 게임 진입 체크를 다시 호출해요.
Example
예제의
RequestGameTerms()는 SDK 함수가 아니라 예제에서 만든 함수예요. 정의는 Stove_APIModule_FetchGameTermsForSteam 문서의 예제에 있어요.
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 게임 진입 — PCSDK3 기동으로 이어갑니다. */
return;
}
switch (Stove_IModuleAPICallbackResult_GetExternalError(callbackResult))
{
case k_EStoveGameCheckerForSteamResultCode_NotAgreeTerms:
/* 이 콜백에는 약관 본문이 없습니다. 약관 조회를 호출해 화면에 채울 값을 받습니다. */
/* 조회 -> 개발사 동의 화면 -> 동의 제출 -> 게임 진입 체크 재호출 순서입니다. */
RequestGameTerms(g_GameId); /* Stove_APIModule_FetchGameTermsForSteam() 호출 */
break;
case k_EStoveGameCheckerForSteamResultCode_GameRestrict:
/* 결과 객체의 제재 정보로 제재 안내 화면을 띄운 뒤 게임 종료 */
break;
case k_EStoveGameCheckerForSteamResultCode_GameServerMaintenance:
/* 결과 객체의 점검 정보로 점검 안내 화면을 띄운 뒤 게임 종료 */
break;
case k_EStoveGameCheckerForSteamResultCode_BlockedIP:
case k_EStoveGameCheckerForSteamResultCode_InvalidProvider:
/* 접속 불가 안내 화면을 띄운 뒤 게임 종료 */
break;
default:
/* 오류 안내 화면을 띄운 뒤 게임 종료 */
break;
}
}
Notes
- 이 코드는
Stove_IModuleAPICallbackResult_GetExternalError()로 전달돼요.Stove_IModuleAPIResult_GetResultCode()와 혼동하지 마세요. - 서버가 함께 내려주는 안내 문구는
Stove_IModuleAPICallbackResult_GetErrorMsg()로 얻어요. - 약관 동의가 서버에 반영되면 이후 호출에서
406401이 다시 나오지 않아요. - 이 목록에 없는 값이
GetExternalError()로 올라올 수 있어요. HTTP 상태 코드가 200 이 아닌데 응답 본문에 코드가 없으면 HTTP 상태 코드가 그대로 전달돼요.switch문에는default분기를 두세요. - 같은 번호를 쓰지만 값 구성이 다른 결과 코드가 API 별로 따로 있어요. 약관 조회는
EStoveFetchGameTermsForSteamResultCode, 약관 동의는EStoveAgreeToGameTermsForSteamResultCode를 써요.404001·406401·503100은 게임 진입 체크에만 있어요.
See Also
EStoveModuleCommonResultCode
종류 결과코드 · 모듈 APIModule · 버전 1.0.0
Description
모든 함수가 공통으로 사용하는 결과 코드예요. 성공은 0 이에요.
| 값을 얻는 곳 | 방법 |
|---|---|
| 동기 함수 | 반환된 IModuleAPIResult* 에서 Stove_IModuleAPIResult_GetResultCode() |
| 비동기 콜백 | Stove_IModuleAPICallbackResult_GetResult() 로 IModuleAPIResult* 를 꺼낸 뒤 같은 방법 |
성공 여부만 볼 때는 Stove_IModuleAPIResult_IsSuccessful() 을 쓰는 편이 간단해요.
이 열거형에는 서버가 내려주는 API 별 코드(
406401등)가 담기지 않아요. 서버 코드는Stove_IModuleAPICallbackResult_GetExternalError()로 따로 전달돼요. 실패 원인을 구분하려면 두 값을 함께 봐야 해요.
결과 코드와 API 별 코드의 관계
| 상황 | 결과 코드 | GetExternalError() |
|---|---|---|
| 정상 | 0 Success | 0 |
HTTP 200 이고 서버 응답 코드가 0 이 아님 | 1 Fail | 서버 응답 코드 (406401 등) |
| HTTP 상태 코드가 200 이 아님 | 21 HttpError | 서버 응답 코드. 응답 본문에 코드가 없으면 HTTP 상태 코드 |
| 응답 본문을 해석할 수 없음 | 22 ResponseError | HTTP 상태 코드 |
| 응답 본문에 결과 값이 없음 | 24 ResponseValueIsNull | 서버 응답 코드 (0 일 수도 있어요) |
| 결과 값의 형식이 예상과 다름 | 25 ResponseInvalidValueFormat | 서버 응답 코드 |
| 호출 자체가 성립하지 않음 (초기화 전 호출, 파라미터 누락 등) | 2 · 10 등 | 0 |
API 별 코드의 전체 목록은 각 API 문서를 참조하세요. 게임 진입 체크 · 약관 조회 · 약관 동의
Declaration
typedef enum EStoveModuleCommonResultCode
{
k_EStoveModuleCommonResultCode_Success = 0,
k_EStoveModuleCommonResultCode_Fail = 1,
// ... 이하 열거값 표 참조
k_EStoveModuleCommonResultCode_UnknownError = 255,
k_EStoveModuleCommonResultCode_Max = 0x7fffffff
} EStoveModuleCommonResultCode;
Enum Values
Show to User 가 O 인 코드는 게임이 사용자에게 상황을 알리는 화면을 띄워야 하는 코드예요. 화면 구성과 문구는 개발사가 정해요. — 는 이 코드가 게임 콜백으로 전달되지 않아 표시를 판단할 일이 없다는 뜻이에요.
일반 결과
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | 성공했어요 | x | |
| 1 | k_EStoveModuleCommonResultCode_Fail | 서버가 응답했지만 요청이 실패했어요. 실제 사유는 GetExternalError() 에 담기며, 사용자 안내 여부도 그 값으로 판단해요 | x |
호출 조건 오류
게임의 연동 코드를 고쳐야 하는 상황이에요. 사용자에게 알릴 내용이 없어요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 2 | k_EStoveModuleCommonResultCode_InvalidParam | 파라미터가 유효하지 않아요. 파라미터 객체가 NULL 이거나 필수 값이 비어 있어요 | x | |
| 3 | k_EStoveModuleCommonResultCode_AlreadySetToAnotherMode | 이미 다른 모드로 설정되어 있어 요청을 처리할 수 없어요 | x | |
| — | 4 ~ 9 | 사용하지 않아요 (예약 구간) | — | — |
| 10 | k_EStoveModuleCommonResultCode_NotInitialized | 초기화되지 않은 상태에서 호출했어요. Stove_APIModule_Initialize() 성공 콜백을 받은 뒤에 호출하세요 | x | |
| 11 | k_EStoveModuleCommonResultCode_AlreadyInitialized | 이미 초기화되어 있어요 | x | |
| — | 12 ~ 20 | 사용하지 않아요 (예약 구간) | — | — |
통신 및 응답 오류
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 21 | k_EStoveModuleCommonResultCode_HttpError | HTTP 상태 코드가 200 이 아니에요. 서버가 코드를 함께 내려준 경우 그 값이 GetExternalError() 에 담기고, 없으면 HTTP 상태 코드가 담겨요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. 확인 |
| 22 | k_EStoveModuleCommonResultCode_ResponseError | 응답 본문을 해석할 수 없어요. 형식이 깨졌거나 필수 항목이 빠진 경우예요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. 확인 |
| 23 | k_EStoveModuleCommonResultCode_ResponseInvalidCode | 응답 코드가 유효하지 않아요. 현재 구현에서는 설정되지 않아요 | — | |
| 24 | k_EStoveModuleCommonResultCode_ResponseValueIsNull | 응답 본문에 결과 값이 없어요. 게임 진입 체크는 성공 응답에 값이 빠졌을 때, 약관 조회·약관 동의는 값이 빠졌을 때 실패 사유와 무관하게 이 코드가 전달돼요 | O | 일시적으로 문제가 발생했습니다. 재시도 후, 오류가 계속될 경우 고객센터에 문의해 주세요. 닫기 고객센터 |
| 25 | k_EStoveModuleCommonResultCode_ResponseInvalidValueFormat | 응답 본문의 결과 값 형식이 예상과 달라요. 약관 조회에서 약관 목록이 배열로 오지 않을 때 전달돼요 | O | 일시적으로 문제가 발생했습니다. 재시도 후, 오류가 계속될 경우 고객센터에 문의해 주세요. 닫기 고객센터 |
| — | 26 ~ 249 | 사용하지 않아요 (예약 구간) | — | — |
시스템 및 런타임 오류
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 250 | k_EStoveModuleCommonResultCode_JsonException | JSON 처리 중 예외가 발생했어요. 게임에 제공되는 함수 경로에서는 설정되지 않아요 | — | |
| 251 | k_EStoveModuleCommonResultCode_PCSDKDllNotFound | 필요한 DLL 을 찾을 수 없어요. 배포 구성에 빠진 파일이 없는지 확인하세요 | O | 게임 실행에 필요한 파일을 찾을 수 없습니다. 게임을 재설치하거나 고객센터에 문의해 주세요. 닫기 고객센터 |
| 252 | k_EStoveModuleCommonResultCode_NotImplemented | 구현되지 않은 기능이에요. 게임에 제공되는 함수 경로에서는 설정되지 않아요 | — | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 종류를 알 수 없는 예외가 발생했어요. 원인 문자열이 없어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. 확인 |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 형식이 있는 예외가 발생했어요. 원인 문자열이 GetErrorMsg() 에 함께 담겨요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. 확인 |
| 255 | k_EStoveModuleCommonResultCode_UnknownError | 알 수 없는 오류예요. 현재 구현에서는 설정되지 않아요 | — | |
| — | 256 ~ 0x7ffffffe | 사용하지 않아요 (예약 구간) | — | — |
| 0x7fffffff | k_EStoveModuleCommonResultCode_Max | 열거형 경계값이에요. 사용하지 않아요 | — | — |
253과254는 예외의 종류로 구분돼요.254는 형식이 있는 예외라 원인 문자열이 함께 오고,253은 종류를 특정할 수 없는 예외라 원인 문자열이 없어요. 사용자에게 보여 줄 화면은 같아도 되지만, 로그에는 두 코드를 구분해 남겨 두세요. 문의 시 원인을 좁히는 데 쓰예요.
Example
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
// 성공 시 로직을 구현해 주세요.
return;
}
switch (Stove_IModuleAPIResult_GetResultCode(apiResult))
{
case k_EStoveModuleCommonResultCode_Fail:
// 서버가 사유를 내려준 경우입니다. GetExternalError() 값으로 분기합니다.
break;
case k_EStoveModuleCommonResultCode_HttpError:
case k_EStoveModuleCommonResultCode_ResponseError:
// 네트워크 또는 서버 상태 안내 화면을 띄웁니다.
break;
case k_EStoveModuleCommonResultCode_UnmanagedException:
case k_EStoveModuleCommonResultCode_ManagedException:
// 일시적인 오류 안내 화면을 띄웁니다.
break;
default:
// 그 밖의 실패 처리를 구현해 주세요.
break;
}
}
Notes
- 서버가 내려주는 API 별 코드는 이 열거형이 아니라
Stove_IModuleAPICallbackResult_GetExternalError()로 전달돼요. 결과 코드만 보고 분기하면 실패 원인을 구분할 수 없어요. 1(Fail)과21(HttpError)은 둘 다GetExternalError()에 서버 코드가 담겨요. 결과 코드가 다르다고 해서 서버 코드를 확인하지 않고 넘어가면 안 돼요.- 서버가 함께 내려주는 안내 문구는
Stove_IModuleAPICallbackResult_GetErrorMsg()로 얻어요. 이 문자열은 콜백이 반환되면 무효가 되므로 필요하면 복사해 두세요. 24(ResponseValueIsNull)와25(ResponseInvalidValueFormat)는 서버 응답이 규격과 다를 때 전달돼요. 게임이 고칠 수 있는 문제가 아니므로 안내 화면을 띄우는 것으로 대응하고, 재현되면 문의해 주세요.- 약관 조회·약관 동의에서는
24가1(Fail)보다 우선해요. 서버가 실패 코드를 내려주면서 결과 값을 함께 보내지 않으면 결과 코드가24로 덮이고, 실제 사유는GetExternalError()에만 남아요. 그래서 실패 원인은 항상GetExternalError()로 먼저 확인해야 해요. onFinished에NULL을 넘기면 파라미터 오류로 처리되지만, 결과를 받을 콜백이 없으므로 게임에서는 아무것도 관측되지 않아요. 항상 콜백을 지정하세요.Stove_IModuleAPIResult_GetResultCode()의 반환 타입은uint32_t이에요. 열거형과 비교할 때 형 변환 경고가 나면 명시적으로 캐스팅하세요.
Changelog
| Version | Change |
|---|---|
| 1.0.0 | 최초 제공 |
See Also
- 기본 연동 안내
- EStoveGameCheckerForSteamResultCode
- EStoveFetchGameTermsForSteamResultCode
- EStoveAgreeToGameTermsForSteamResultCode
- EStoveAPIModuleMethodCode
IModuleAgreeToGameTermsForSteamOutcome
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_AgreeToGameTermsForSteam 의 콜백 두 번째 인자로 전달되는 결과 데이터예요. 서버가 발급한 동의 식별값(guid) 하나를 담아요.
동의 식별값은 서버가 동의 처리 결과를 구분하려고 발급하는 값이에요. 모듈은 값을 해석하지 않고 그대로 전달만 해요. 게임이 이 값을 직접 쓸 일은 없으며, 문제를 확인해야 할 때 로그로 남겨 두면 도움이 돼요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
이 객체는 SDK 소유이며 콜백이 반환되는 순간 무효가 돼요.
Destroy()를 호출하지 말고, 값을 남겨 두려면 콜백 안에서 복사하세요.
Declaration
typedef struct IModuleAgreeToGameTermsForSteamOutcome IModuleAgreeToGameTermsForSteamOutcome;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Guid | const wchar_t* | 읽기 | Stove_IModuleAgreeToGameTermsForSteamOutcome_GetGuid() | 서버가 발급한 동의 식별값이에요. 게임 진입 체크 결과의 UserId(게임 유저 식별값)와 같은 값이며, 모듈은 이 값을 해석하지 않아요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 반환되면 무효) |
| 문자열 | 반환되는 const wchar_t* 는 이 객체의 내부 버퍼예요. 보관하려면 콜백 안에서 복사해야 해요 |
Example
void __cdecl OnAgreeToGameTermsFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleAgreeToGameTermsForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
const wchar_t* guid =
Stove_IModuleAgreeToGameTermsForSteamOutcome_GetGuid(result);
(void)guid; /* 로그로 남겨 둡니다. */
/* 동의가 반영되었으므로 게임 진입 체크를 다시 호출합니다. */
}
else
{
/* 실패 시 로직을 구현해 주세요. */
}
/* result 에는 Destroy() 를 호출하지 않습니다. */
}
Notes
- 동의 제출이 성공하면 게임 진입 체크(Stove_APIModule_GameCheckerForSteam)를 다시 호출해요. 이때 스팀 세션 토큰은 같은 값을 그대로 써요.
- 실패했을 때는 이 객체에 값이 채워지지 않아요. 성공 여부를 먼저 확인하세요.
- 성공 여부는 이 객체가 아니라 콜백 첫 번째 인자의 결과로 판단해요. 실패 사유는
Stove_IModuleAPICallbackResult_GetExternalError()로 확인해요.
See Also
- Stove_APIModule_AgreeToGameTermsForSteam
- IModuleAgreeToGameTermsForSteamParam
- EStoveAgreeToGameTermsForSteamResultCode
IModuleAgreeToGameTermsForSteamParam
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_AgreeToGameTermsForSteam 호출에 필요한 파라미터를 담아요. 게임 ID 와 스팀 세션 토큰을 설정해요.
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamParam) 으로 만들고, 값을 채운 뒤 호출하고, 함수가 반환하면 Destroy() 로 해제해요.
사용자에게 약관 화면을 보여 주고 동의를 받는 절차는 개발사가 구현해요. 이 API 는 동의 사실을 서버에 제출하는 역할만 해요.
스팀 세션 토큰은 게임 진입 체크에 쓴 값을 그대로 넣어요. 프로세스당 한 번 발급받아 게임 세션 동안 재사용하는 값이므로 이 호출을 위해 다시 발급받지 않아요.
Declaration
typedef struct IModuleAgreeToGameTermsForSteamParam IModuleAgreeToGameTermsForSteamParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
GameId | const wchar_t* | 읽기·쓰기 | Stove_IModuleAgreeToGameTermsForSteamParam_GetGameId() / SetGameId() | 스토브 플랫폼에 게임을 등록할 때 발급되는 고유 ID 예요. |
SteamSessionToken | const wchar_t* | 읽기·쓰기 | Stove_IModuleAgreeToGameTermsForSteamParam_GetSteamSessionToken() / SetSteamSessionToken() | Steamworks ISteamUser::GetAuthTicketForWebApi 로 발급받은 세션 토큰이에요. 게임 진입 체크에 쓴 값과 같은 값을 넣어요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) — 약관 동의 함수가 반환한 뒤 해제해요 |
| 문자열 소유 | Set...() 에 넘긴 문자열은 파라미터 객체가 복사해 보관해요. 호출자 쪽 버퍼는 바로 정리해도 돼요 |
Example
IModuleAgreeToGameTermsForSteamParam* param =
(IModuleAgreeToGameTermsForSteamParam*)Stove_APIModule_CreateParam(
k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamParam);
Stove_IModuleAgreeToGameTermsForSteamParam_SetGameId(param, L"YOUR_GAME_ID");
Stove_IModuleAgreeToGameTermsForSteamParam_SetSteamSessionToken(param, steamSessionToken);
Stove_APIModule_AgreeToGameTermsForSteam(param, OnAgreeToGameTermsFinished, NULL);
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
Notes
- 어떤 약관에 동의했는지는 파라미터에 넣지 않아요. 조회한 약관 전체에 대한 동의로 처리돼요.
- 동의 제출이 성공하면 게임 진입 체크를 다시 호출해요. 이때도 같은 스팀 세션 토큰을 써요.
- 초기화가 끝나기 전에 호출하면
k_EStoveModuleCommonResultCode_NotInitialized(10) 로 실패해요.
See Also
- Stove_APIModule_AgreeToGameTermsForSteam
- IModuleAgreeToGameTermsForSteamOutcome
- IModuleFetchGameTermsForSteamParam
- Stove_APIModule_CreateParam
IModuleAPICallbackResult
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
모든 비동기 API 의 콜백 첫 번째 인자로 전달되는 결과예요. IModuleAPIResult 를 감싸고, 오류 메시지 · 서버가 내려준 결과 코드 · 호출할 때 넘긴 userData 포인터를 함께 담아요.
실패 원인은 두 값을 함께 봐야 알 수 있어요. GetResult() 의 ResultCode 에는 공통 결과 코드가, GetExternalError() 에는 서버가 내려준 API 별 코드가 담겨요.
| 상황 | ResultCode | ExternalError |
|---|---|---|
| 성공 | 0 (Success) | 0 |
HTTP 200 이지만 서버 응답의 code 가 0 이 아님 | 1 (Fail) | 서버가 내려준 코드 (예: 406401) |
| HTTP 200 이 아님 | 21 (HttpError) | 서버가 내려준 코드 |
GetResultCode()만 보고 분기하면 약관 미동의(406401) · 제재(403201) · 점검(503100) 을 구분할 수 없어요. 화면 분기는GetExternalError()값으로 하세요.
이 객체와
GetResult()로 얻은 결과 객체는 SDK 소유예요.Destroy()를 호출하지 말고, 보관할 값은 콜백 안에서 복사해 두세요.
Declaration
typedef struct IModuleAPICallbackResult IModuleAPICallbackResult;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Result | IModuleAPIResult* | 읽기 | Stove_IModuleAPICallbackResult_GetResult() | 내부 결과 객체예요. 공통 결과 코드와 메서드 코드를 담아요. 콜백 동안에만 유효해요. |
ErrorMsg | const wchar_t* | 읽기 | Stove_IModuleAPICallbackResult_GetErrorMsg() | 실패 사유를 설명하는 메시지예요. 로그용 값이며 사용자에게 그대로 보여 줄 문구는 아니에요. |
ExternalError | int32_t | 읽기 | Stove_IModuleAPICallbackResult_GetExternalError() | 서버가 내려준 API 별 결과 코드예요. 예를 들어 게임 진입 체크의 406401 · 403201 · 503100 이 이 값으로 전달돼요. |
UserData | void* | 읽기 | Stove_IModuleAPICallbackResult_GetUserData() | 비동기 API 를 호출할 때 넘긴 userData 포인터예요. SDK 는 값을 그대로 전달만 해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 반환되면 무효) |
GetResult() 의 반환값 | 이 객체가 소유해요. 따로 해제하지 않아요 |
| 문자열 | 반환되는 const wchar_t* 는 이 객체의 내부 버퍼예요. 보관하려면 복사해야 해요 |
UserData | SDK 가 관리하지 않는 포인터예요. 수명은 넘긴 쪽이 책임져요 |
Example
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 성공 시 로직을 구현해 주세요. */
return;
}
/* 공통 결과 코드 — 통신 자체가 실패했는지 판단합니다. */
uint32_t resultCode = Stove_IModuleAPIResult_GetResultCode(apiResult);
/* 서버가 내려준 코드 — 화면 분기는 이 값으로 합니다. */
int32_t externalError = Stove_IModuleAPICallbackResult_GetExternalError(callbackResult);
if (externalError == k_EStoveGameCheckerForSteamResultCode_NotAgreeTerms)
{
/* 약관 동의 화면으로 이동합니다. */
}
else if (resultCode == k_EStoveModuleCommonResultCode_HttpError)
{
/* 통신 실패 안내를 띄웁니다. */
}
else
{
const wchar_t* errorMsg = Stove_IModuleAPICallbackResult_GetErrorMsg(callbackResult);
(void)errorMsg; /* 로그로 남깁니다. */
}
/* callbackResult, apiResult, result 는 Destroy() 를 호출하지 않습니다. */
}
Notes
- 콜백은 SDK 내부 스레드가 아니라
Stove_APIModule_RunCallback()을 호출한 스레드에서 실행돼요. 이 함수는 게임 UI(메인) 스레드에서 호출해요. userData는 콜백 인자로 직접 오지 않아요.Stove_IModuleAPICallbackResult_GetUserData()로 꺼내요.userData로 스택 변수나 임시 객체를 넘기면 콜백 시점에 이미 소멸해 댕글링 포인터가 되어서 크래시의 원인이 될 수 있어요. 쓰지 않으면NULL을 넘기세요.ExternalError값의 의미는 API 마다 달라요. 게임 진입 체크는 EStoveGameCheckerForSteamResultCode, 약관 조회는 EStoveFetchGameTermsForSteamResultCode, 약관 동의는 EStoveAgreeToGameTermsForSteamResultCode 를 참고하세요.- 성공했을 때
ExternalError는0이에요. 실패했을 때만 값을 확인하세요.
See Also
IModuleAPIInitializeParam
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_Initialize 호출에 필요한 파라미터를 담아요. 실행 환경 · 플랫폼 이름 · 스팀 앱 ID · 스팀 사용자 ID 를 설정해요.
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_APIInitializeParam) 으로 만들고, 값을 채운 뒤 초기화 함수에 넘기고, 함수가 반환하면 Destroy() 로 해제해요. 비동기 함수이지만 SDK 가 호출 시점에 값을 복사하므로 콜백을 기다릴 필요 없이 바로 해제할 수 있어요.
플랫폼 이름은 L"STEAM" 고정이에요. 지원하는 외부 플랫폼이 스팀 하나이기 때문이에요.
Declaration
typedef struct IModuleAPIInitializeParam IModuleAPIInitializeParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Environment | const wchar_t* | 읽기·쓰기 | Stove_IModuleAPIInitializeParam_GetEnvironment() / SetEnvironment() | 접속할 서버 환경이에요. 운영은 L"live", 개발·검증은 L"sandbox" 를 넣어요. 정해진 값이 아니면 초기화가 실패해요 (아래 주의 참조). |
PlatformName | const wchar_t* | 읽기·쓰기 | Stove_IModuleAPIInitializeParam_GetPlatformName() / SetPlatformName() | 외부 플랫폼 이름이에요. L"STEAM" 고정값이에요. |
SteamAppId | const wchar_t* | 읽기·쓰기 | Stove_IModuleAPIInitializeParam_GetSteamAppId() / SetSteamAppId() | 스팀에 등록된 앱 ID 예요. 문자열로 넣어요. |
SteamUserId | const wchar_t* | 읽기·쓰기 | Stove_IModuleAPIInitializeParam_GetSteamUserId() / SetSteamUserId() | 스팀 사용자 ID(SteamID64)예요. Steamworks 에서 얻은 값을 문자열로 넣어요. |
Environment에L"live"·L"sandbox"가 아닌 문자열을 넣으면 초기화가2(InvalidParam)로 실패해요. 빈 문자열도 같아요. 다음 두 가지를 특히 조심하세요.
- 앞뒤 공백을 허용하지 않아요.
L"LIVE "처럼 공백이 붙으면 실패해요.- 대소문자는 가리지 않아요.
L"LIVE"·L"Live"·L"live"는 모두 같게 동작해요.실패했을 때 어느 값이 잘못되었는지는 콜백의
Stove_IModuleAPICallbackResult_GetErrorMsg()메시지로 확인할 수 있어요.
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_APIInitializeParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) — 초기화 함수가 반환한 뒤 해제해요 |
| 문자열 소유 | Set...() 에 넘긴 문자열은 파라미터 객체가 복사해 보관해요. 호출자 쪽 버퍼는 바로 정리해도 돼요 |
Example
IModuleAPIInitializeParam* param =
(IModuleAPIInitializeParam*)Stove_APIModule_CreateParam(
k_EStoveAPIModuleTypeKind_APIInitializeParam);
Stove_IModuleAPIInitializeParam_SetEnvironment(param, L"live");
Stove_IModuleAPIInitializeParam_SetPlatformName(param, L"STEAM");
Stove_IModuleAPIInitializeParam_SetSteamAppId(param, L"YOUR_STEAM_APP_ID");
Stove_IModuleAPIInitializeParam_SetSteamUserId(param, steamUserId);
Stove_APIModule_Initialize(param, OnInitializeFinished, NULL);
/* 비동기 함수이지만 파라미터는 바로 해제할 수 있습니다. */
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
Notes
- 게임 ID 는 이 파라미터에 없어요. 게임 진입 체크 · 약관 조회 · 약관 동의 파라미터에 각각 넣어요.
- 스팀 세션 토큰도 이 파라미터에 없어요. 세션 토큰은 프로세스당 한 번 발급받아 두고, 게임 진입 체크와 약관 동의 파라미터에 같은 값을 넣어요.
- 초기화는 비동기예요. 콜백을 받으려면 게임 루프에서
Stove_APIModule_RunCallback()을 돌리고 있어야 해요. - 이미 초기화된 상태에서 다시 호출하면
k_EStoveModuleCommonResultCode_AlreadyInitialized(11) 로 실패해요.
See Also
IModuleAPIResult
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
동기 함수의 호출 결과예요. 어떤 함수가 만든 결과인지(MethodCode)와 결과 코드(ResultCode)를 담아요.
Stove_APIModule_UnInitialize() · Stove_APIModule_SetLanguage() · Stove_APIModule_GetGdsInfo() · Stove_APIModule_GetVersion() 처럼 동기로 동작하는 함수가 이 객체를 반환해요. 이 경로로 받은 객체는 호출자가 해제해야 해요.
비동기 콜백에서는 IModuleAPICallbackResult 의 GetResult() 로 같은 타입의 객체를 얻어요. 이 경우에는 SDK 가 소유하므로 해제하지 않아요.
ResultCode에는EStoveModuleCommonResultCode값(성공0, 실패1, HTTP 실패21등)이 담겨요. 서버가 내려주는 API 별 코드(예:406401)는 이 값이 아니라 콜백 결과의GetExternalError()로 전달돼요.
Declaration
typedef struct IModuleAPIResult IModuleAPIResult;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
SDKName | const wchar_t* | 읽기 | Stove_IModuleAPIResult_GetSDKName() | 결과를 만든 모듈 이름이에요. 로그를 남길 때 쓰는 값이에요. |
MethodCode | uint32_t | 읽기 | Stove_IModuleAPIResult_GetMethodCode() | 어떤 함수가 만든 결과인지 나타내는 코드예요. EStoveAPIModuleMethodCode 값과 대응해요. |
ResultCode | uint32_t | 읽기 | Stove_IModuleAPIResult_GetResultCode() | 결과 코드예요. EStoveModuleCommonResultCode 값이며, 성공은 0 이에요. |
IsSuccessful | bool | 읽기 | Stove_IModuleAPIResult_IsSuccessful() | 성공 여부예요. ResultCode 가 0 이면 true 예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | 반환 경로에 따라 달라요 |
| 동기 함수의 반환값 | 호출자가 반드시 해제 — 결과 코드를 확인한 뒤 Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result) |
콜백 결과의 GetResult() | SDK 소유 — 해제 금지. 콜백이 반환되면 무효가 돼요 |
| 문자열 | 반환되는 const wchar_t* 는 객체 내부 버퍼예요. 보관하려면 복사해야 해요 |
Example
/* 동기 함수 — 반환된 결과 객체는 호출자가 해제합니다. */
IModuleAPIResult* result = Stove_APIModule_SetLanguage(L"ko");
if (Stove_IModuleAPIResult_IsSuccessful(result))
{
/* 성공 시 로직을 구현해 주세요. */
}
else
{
uint32_t resultCode = Stove_IModuleAPIResult_GetResultCode(result);
uint32_t methodCode = Stove_IModuleAPIResult_GetMethodCode(result);
(void)resultCode;
(void)methodCode;
/* 실패 시 로직을 구현해 주세요. */
}
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result);
Notes
IsSuccessful()은ResultCode == 0과 같은 뜻이에요. 성공 여부만 볼 때는IsSuccessful()을 쓰는 편이 읽기 좋아요.- 실패 원인을 정확히 알려면 콜백 경로에서는
ResultCode와GetExternalError()를 함께 봐야 해요.ResultCode만으로는 서버가 내려준 사유를 구분할 수 없어요. MethodCode는 여러 API 의 결과를 한 곳에서 로그로 남길 때 어떤 호출의 결과인지 구분하는 용도로 써요.- 동기 함수의 반환값을 해제하지 않으면 메모리가 새어 나가요. 결과 코드만 확인하고 버리는 경우에도 반드시 해제해야 해요.
See Also
IModuleFetchGameTermsForSteamContent
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
IModuleFetchGameTermsForSteamOutcome 의 GetContentAt(index) 로 얻는 약관 한 건이에요. 화면에 띄울 제목과 본문, 시행 일시, 동의 유형을 담아요.
동의 유형(AgreeType)은 서버가 약관을 분류해 내려주는 값이에요. FIRST_MUST 는 최초 동의가 필요한 약관(스팀 게임 서비스 이용 약관)이고, NONE 은 그 분류에 해당하지 않는 항목이에요. 배열 순서가 아니라 이 값으로 판단해야 해요.
내려온 약관은 한 화면에 모아 보여 주세요. 동의 체크는 항목마다 두지 않고 화면 아래쪽에 통합 동의 하나로 두면 돼요. 동의를 유형별로 나누지 않아요.
각 값이 화면 어디에 들어가는지는 다음과 같아요. Title 은 약관 제목, Text 는 약관 본문, EnforcedDt 는 시행 일시, AgreeType 은 동의 유형 구분이에요. 화면 제목과 버튼 · 체크박스 라벨, 날짜 표기 형식은 개발사가 정해요.
약관 본문(
Text)은 HTML 로 전달돼요.스토브 파트너스에 입력된 값을 그대로 전달하므로 기본적으로 HTML 이 담겨 와요. 게임 UI 구현상 HTML 을 그대로 표시하기 어렵다면 평문으로 바꿔 받을 수 있으니 기술지원으로 문의해 주세요.
이 객체는 상위 결과 객체가 소유해요.
Destroy()를 호출하지 말고, 화면에 띄울 문자열은 콜백 안에서 복사해 두세요.
Declaration
typedef struct IModuleFetchGameTermsForSteamContent IModuleFetchGameTermsForSteamContent;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Title | const wchar_t* | 읽기 | Stove_IModuleFetchGameTermsForSteamContent_GetTitle() | 약관 제목이에요. |
Text | const wchar_t* | 읽기 | Stove_IModuleFetchGameTermsForSteamContent_GetText() | 약관 본문이에요. |
EnforcedDt | int64_t | 읽기 | Stove_IModuleFetchGameTermsForSteamContent_GetEnforcedDt() | 약관 시행 일시예요. Unix epoch 밀리초예요. |
AgreeType | const wchar_t* | 읽기 | Stove_IModuleFetchGameTermsForSteamContent_GetAgreeType() | 동의 유형이에요. FIRST_MUST 는 최초 동의가 필요한 약관이에요. 동의는 유형별로 나누지 않아요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — 상위 결과 객체가 소유하며, 콜백이 반환되면 함께 무효가 돼요 |
| 문자열 | 반환되는 const wchar_t* 는 내부 버퍼예요. 보관하려면 콜백 안에서 복사해야 해요 |
Example
예제의
AddRequiredTermsSection()·AddNoticeTermsSection()는 SDK 가 제공하지 않는 가상 함수예요. 게임 UI 와 연결되는 부분이라 개발사가 직접 구현해야 해요.
/* 약관 한 건을 화면 모델로 옮기는 예입니다. */
typedef struct GameTermsItem
{
wchar_t* Title; /* 약관 제목 */
wchar_t* Text; /* 약관 본문 */
int64_t EnforcedDt; /* 시행 일시 (epoch 밀리초) */
int MustAgree; /* 필수 동의 여부 */
} GameTermsItem;
static int CopyTermsItem(const IModuleFetchGameTermsForSteamContent* content,
GameTermsItem* item)
{
const wchar_t* title;
const wchar_t* text;
const wchar_t* agreeType;
if (content == NULL || item == NULL)
{
return 0;
}
title = Stove_IModuleFetchGameTermsForSteamContent_GetTitle(content);
text = Stove_IModuleFetchGameTermsForSteamContent_GetText(content);
agreeType = Stove_IModuleFetchGameTermsForSteamContent_GetAgreeType(content);
/* AgreeType 은 열거형이 아니라 문자열입니다. 배열 순서로 판단하지 않습니다. */
item->MustAgree = (agreeType != NULL && wcscmp(agreeType, L"FIRST_MUST") == 0);
/* 콜백이 반환되면 포인터가 무효가 되므로 여기서 복사합니다. */
item->Title = _wcsdup(title != NULL ? title : L"");
item->Text = _wcsdup(text != NULL ? text : L"");
item->EnforcedDt = Stove_IModuleFetchGameTermsForSteamContent_GetEnforcedDt(content);
return 1;
}
static void ReadTerms(const IModuleFetchGameTermsForSteamOutcome* result)
{
uint32_t contentCount =
Stove_IModuleFetchGameTermsForSteamOutcome_GetContentCount(result);
for (uint32_t i = 0; i < contentCount; ++i)
{
const IModuleFetchGameTermsForSteamContent* content =
Stove_IModuleFetchGameTermsForSteamOutcome_GetContentAt(result, i);
GameTermsItem item;
if (CopyTermsItem(content, &item) == 0)
{
continue;
}
if (item.MustAgree)
{
/* 최초 동의가 필요한 약관입니다. 화면에 필수 표시를 함께 노출합니다. */
AddRequiredTermsSection(&item);
}
else
{
/* 그 밖의 항목입니다. 이 항목도 동의 대상이므로 함께 보여 줍니다. */
AddNoticeTermsSection(&item);
}
}
/* content 에는 Destroy() 를 호출하지 않습니다. */
}
Notes
- 이 객체는 단독으로 얻을 수 없어요. 상위 결과 객체의
GetContentAt(index)로만 접근해요. AgreeType은 열거형이 아니라 문자열이에요. 비교할 때 문자열로 비교하세요.- 본문은 HTML 로 전달돼요. 스토브 파트너스에 입력된 값을 그대로 전달하며 SDK 나 서버가 가공하지 않아요.
- 본문이 길어서 스크롤 가능한 영역에 넣어야 해요. 잘라내거나 요약하면 안 돼요.
- HTML 을 그대로 표시하기 어렵다면 평문으로 바꿔 받을 수 있으니 기술지원으로 문의해 주세요.
EnforcedDt는 Unix epoch 밀리초 값이에요. 초 단위 API 에 넘길 때는1000으로 나누세요. 표시 형식 변환은 게임 쪽에서 처리해요.
See Also
- IModuleFetchGameTermsForSteamOutcome
- Stove_APIModule_FetchGameTermsForSteam
- EStoveFetchGameTermsForSteamAgType
IModuleFetchGameTermsForSteamOutcome
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_FetchGameTermsForSteam 의 콜백 두 번째 인자로 전달되는 결과 데이터예요. 사용자에게 보여 줄 약관 목록을 담아요.
약관은 여러 건이 올 수 있어요. 배열 포인터로 주지 않고 개수와 인덱스 접근자로 읽어요. GetContentCount() 로 개수를 얻고 GetContentAt(index) 로 한 건씩 꺼내요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
이 객체와
GetContentAt()으로 얻은 항목은 SDK 소유이며 콜백이 반환되는 순간 무효가 돼요.Destroy()를 호출하지 말고, 화면에 띄울 제목과 본문은 콜백 안에서 깊은 복사해 두세요.
Declaration
typedef struct IModuleFetchGameTermsForSteamOutcome IModuleFetchGameTermsForSteamOutcome;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
ContentCount | uint32_t | 읽기 | Stove_IModuleFetchGameTermsForSteamOutcome_GetContentCount() | 약관 항목 수예요. 없으면 0 이에요. |
ContentAt(index) | const IModuleFetchGameTermsForSteamContent* | 읽기 | Stove_IModuleFetchGameTermsForSteamOutcome_GetContentAt() | index(0부터 시작) 위치의 약관 항목이에요. index 가 개수 이상이면 NULL 을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 반환되면 무효) |
| 약관 항목 | 이 객체가 소유해요. GetContentAt() 으로 얻은 포인터도 해제하지 않아요 |
| 문자열 | 항목의 제목 · 본문은 내부 버퍼 포인터예요. 화면에 띄우려면 콜백 안에서 복사해야 해요 |
Example
예제의
ShowGameTermsUI()는 SDK 가 제공하지 않는 가상 함수예요. 게임 UI 와 연결되는 부분이라 개발사가 직접 구현해야 해요.
/* 약관 화면에 넘길 모델입니다. 항목 수만큼 채워서 화면으로 넘깁니다. */
typedef struct GameTermsItem
{
wchar_t* Title; /* 약관 제목 */
wchar_t* Text; /* 약관 본문 */
int64_t EnforcedDt; /* 시행 일시 (epoch 밀리초) */
int MustAgree; /* 필수 동의 여부 */
} GameTermsItem;
#define MAX_GAME_TERMS 16
static GameTermsItem g_Terms[MAX_GAME_TERMS];
static uint32_t g_TermsCount = 0;
void __cdecl OnFetchGameTermsFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleFetchGameTermsForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (!Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 실패 시 로직을 구현해 주세요. */
return;
}
uint32_t contentCount =
Stove_IModuleFetchGameTermsForSteamOutcome_GetContentCount(result);
if (contentCount == 0)
{
/* 화면에 띄울 약관이 없습니다. 동의 화면을 띄우지 않습니다. */
return;
}
g_TermsCount = 0;
for (uint32_t i = 0; i < contentCount && g_TermsCount < MAX_GAME_TERMS; ++i)
{
const IModuleFetchGameTermsForSteamContent* content =
Stove_IModuleFetchGameTermsForSteamOutcome_GetContentAt(result, i);
if (content == NULL)
{
continue;
}
const wchar_t* title =
Stove_IModuleFetchGameTermsForSteamContent_GetTitle(content);
const wchar_t* text =
Stove_IModuleFetchGameTermsForSteamContent_GetText(content);
const wchar_t* agreeType =
Stove_IModuleFetchGameTermsForSteamContent_GetAgreeType(content);
/* 콜백이 반환되면 위 포인터가 무효가 되므로 여기서 복사합니다. */
GameTermsItem* item = &g_Terms[g_TermsCount++];
item->Title = _wcsdup(title != NULL ? title : L"");
item->Text = _wcsdup(text != NULL ? text : L"");
item->EnforcedDt = Stove_IModuleFetchGameTermsForSteamContent_GetEnforcedDt(content);
item->MustAgree = (agreeType != NULL && wcscmp(agreeType, L"FIRST_MUST") == 0);
}
/* 복사한 값으로 약관 화면을 띄웁니다. 항목이 여러 건이면 전부 보여 줍니다. */
ShowGameTermsUI(g_Terms, g_TermsCount);
/* result 와 약관 항목에는 Destroy() 를 호출하지 않습니다. */
}
Notes
- 인덱스는 0 부터 시작하고
GetContentCount() - 1까지 유효해요. 범위를 벗어나면NULL이 반환되므로 반복문 안에서도 널 검사를 해 두세요. GetContentAt()이 돌려주는 객체의 수명은 이 객체와 같아요. 콜백이 끝나면 함께 무효가 돼요.- 약관 본문은 길 수 있어요. 콜백 안에서 화면을 그리기보다 값을 복사해 두고 콜백 밖에서 화면을 구성하는 편이 좋아요.
- 본문(
Text)은 HTML 로 전달돼요. 화면에 넣기 어렵다면 기술지원으로 문의해 평문으로 바꿔 받을 수 있어요. - 조회 결과가
0건이면 화면에 띄울 약관이 없다는 뜻이에요. 동의 제출로 넘어가기 전에 개수를 확인하세요. - 항목 하나가 약관 화면의 한 묶음(제목 · 본문 · 시행 일시 · 동의 유형)에 대응해요. 항목이 여러 건이면 그 수만큼 반복해서 보여 주세요.
See Also
- IModuleFetchGameTermsForSteamContent
- Stove_APIModule_FetchGameTermsForSteam
- IModuleFetchGameTermsForSteamParam
- EStoveFetchGameTermsForSteamResultCode
IModuleFetchGameTermsForSteamParam
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_FetchGameTermsForSteam 호출에 필요한 파라미터를 담아요. 게임 ID 와 약관 종류를 설정해요.
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamParam) 으로 만들고, 값을 채운 뒤 호출하고, 함수가 반환하면 Destroy() 로 해제해요.
약관 종류(AgType)는 어떤 약관 묶음을 받을지 정하는 값이에요. 스팀 게임 서비스 이용 약관은 k_EStoveFetchGameTermsForSteamAgType_Steam(1), AGS 이관 약관은 k_EStoveFetchGameTermsForSteamAgType_Mig(2) 예요.
AgType초기값은k_EStoveFetchGameTermsForSteamAgType_Default(0) 이며, 이 값으로 조회하면 스팀 게임 서비스 약관이 내려와요. AGS 이관 약관이 필요할 때만2로 설정하세요.
Declaration
typedef struct IModuleFetchGameTermsForSteamParam IModuleFetchGameTermsForSteamParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
GameId | const wchar_t* | 읽기·쓰기 | Stove_IModuleFetchGameTermsForSteamParam_GetGameId() / SetGameId() | 스토브 플랫폼에 게임을 등록할 때 발급되는 고유 ID 예요. |
AgType | int32_t | 읽기·쓰기 | Stove_IModuleFetchGameTermsForSteamParam_GetAgType() / SetAgType() | 조회할 약관 종류예요. EStoveFetchGameTermsForSteamAgType 값을 넣어요. 넣지 않으면 0 이 쓰이며 스팀 게임 서비스 약관이 내려와요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) — 약관 조회 함수가 반환한 뒤 해제해요 |
| 문자열 소유 | SetGameId() 에 넘긴 문자열은 파라미터 객체가 복사해 보관해요. 호출자 쪽 버퍼는 바로 정리해도 돼요 |
Example
IModuleFetchGameTermsForSteamParam* param =
(IModuleFetchGameTermsForSteamParam*)Stove_APIModule_CreateParam(
k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamParam);
Stove_IModuleFetchGameTermsForSteamParam_SetGameId(param, L"YOUR_GAME_ID");
Stove_IModuleFetchGameTermsForSteamParam_SetAgType(param, k_EStoveFetchGameTermsForSteamAgType_Steam);
Stove_APIModule_FetchGameTermsForSteam(param, OnFetchGameTermsFinished, NULL);
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
Notes
AgType는int32_t로 선언되어 있어요. 열거값을 그대로 넣으면 돼요.- 이 파라미터에는 스팀 세션 토큰이 없어요. 약관 조회는 게임 ID 와 약관 종류만으로 동작해요.
- 게임 진입 체크가
406401(약관 미동의)로 실패했을 때 이 API 로 약관을 받아 화면에 띄우고, 동의를 받은 뒤 Stove_APIModule_AgreeToGameTermsForSteam 으로 제출해요.
See Also
- Stove_APIModule_FetchGameTermsForSteam
- EStoveFetchGameTermsForSteamAgType
- IModuleFetchGameTermsForSteamOutcome
- Stove_APIModule_CreateParam
IModuleGameCheckerForSteamGdsInfo
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
IModuleGameCheckerForSteamOutcome 의 GetGdsInfo() 로 얻는 지역 정보예요. 접속 국가와 그 국가에 적용되는 규제, 시간대, 언어를 담아요.
국가는 서버가 접속 IP 로 판별해요. 판별하지 못하면 기본값이 채워지고 IsDefault 가 true 가 돼요. 규제 표기(예: GDPR)가 필요한 화면이나 시간 표시에 이 값을 써요.
이 객체는 상위 결과 객체가 소유해요.
Destroy()를 호출하지 말고, 보관할 값은 콜백 안에서 복사해 두세요.
Declaration
typedef struct IModuleGameCheckerForSteamGdsInfo IModuleGameCheckerForSteamGdsInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
IsDefault | bool | 읽기 | Stove_IModuleGameCheckerForSteamGdsInfo_GetIsDefault() | IP 로 국가를 판별하지 못해 기본값을 쓴 경우 true 예요. |
Nation | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamGdsInfo_GetNation() | 국가 코드예요(ISO 3166-1 ALPHA-2). |
Regulation | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamGdsInfo_GetRegulation() | 국가 코드에 따라 적용되는 규제 이름이에요(예: GDPR). |
Timezone | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamGdsInfo_GetTimezone() | IANA TZDB 형식의 시간대 ID 예요(예: Asia/Seoul). |
UtcOffset | int32_t | 읽기 | Stove_IModuleGameCheckerForSteamGdsInfo_GetUtcOffset() | 해당 시간대의 UTC 오프셋이에요. 단위는 분이에요 (한국 시간이면 540). |
Lang | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamGdsInfo_GetLang() | 언어 코드예요(ISO 639-1 ALPHA-2). |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — 상위 결과 객체가 소유하며, 콜백이 반환되면 함께 무효가 돼요 |
| 문자열 | 반환되는 const wchar_t* 는 내부 버퍼예요. 보관하려면 콜백 안에서 복사해야 해요 |
Example
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (!Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 실패 시 로직을 구현해 주세요. */
return;
}
const IModuleGameCheckerForSteamGdsInfo* gdsInfo =
Stove_IModuleGameCheckerForSteamOutcome_GetGdsInfo(result);
if (gdsInfo != NULL)
{
const wchar_t* nation = Stove_IModuleGameCheckerForSteamGdsInfo_GetNation(gdsInfo);
const wchar_t* regulation = Stove_IModuleGameCheckerForSteamGdsInfo_GetRegulation(gdsInfo);
int32_t utcOffset =
Stove_IModuleGameCheckerForSteamGdsInfo_GetUtcOffset(gdsInfo);
/* 콜백 밖에서 쓸 값은 여기서 복사합니다. */
(void)nation;
(void)regulation;
(void)utcOffset;
}
/* gdsInfo 에는 Destroy() 를 호출하지 않습니다. */
}
Notes
UtcOffset의 단위는 분이에요. 시(hour)로 환산할 때는60으로 나누세요. 시간대를 정확히 다뤄야 하면 IANA 시간대 ID 인Timezone을 함께 쓰는 편이 안전해요.- 이 객체에는 클라이언트 IP 를 돌려주는 멤버가 없어요. 서버가 해석한 IP 값이 필요하다고 안내한 자료가 있더라도 현재 인터페이스에서는 제공하지 않아요.
- 멤버 구성이 같은 IModuleStoveGDSInfo 와는 다른 타입이에요. 그쪽은 동기 조회 함수가 돌려주는 객체이고 호출자가 해제해야 해요.
- 게임 진입 체크가 실패하면 값이 비어 있는 객체로 전달돼요.
See Also
IModuleGameCheckerForSteamMaintenanceInfo
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
IModuleGameCheckerForSteamOutcome 의 GetMaintenanceInfo() 로 얻는 점검 정보예요. 점검 기간과 안내 제목 · 본문을 담아요.
게임 진입 체크가 점검(k_EStoveGameCheckerForSteamResultCode_GameServerMaintenance, 503100)으로 실패했을 때 값이 채워져요. 그 밖의 상황에서는 값이 비어 있는 객체로 전달돼요.
점검 안내 화면은 개발사가 구현해요. 제목(Title)과 본문(Msg)을 그대로 화면에 쓸 수 있어요.
이 객체는 상위 결과 객체가 소유해요.
Destroy()를 호출하지 말고, 보관할 값은 콜백 안에서 복사해 두세요.
Declaration
typedef struct IModuleGameCheckerForSteamMaintenanceInfo IModuleGameCheckerForSteamMaintenanceInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
StartDt | int64_t | 읽기 | Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetStartDt() | 점검 시작 일시예요. 단위는 밀리초(Unix epoch)예요. |
EndDt | int64_t | 읽기 | Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetEndDt() | 점검 종료 일시예요. 단위는 밀리초(Unix epoch)예요. |
Type | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetType() | 점검 유형이에요. |
UseYn | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetUseYn() | 점검 안내 노출 여부예요. "Y" 또는 "N" 문자열이에요. |
Title | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetTitle() | 점검 안내 제목이에요. |
Msg | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetMsg() | 점검 안내 본문이에요. |
GameId | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetGameId() | 점검 대상 게임 ID 예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — 상위 결과 객체가 소유하며, 콜백이 반환되면 함께 무효가 돼요 |
| 문자열 | 반환되는 const wchar_t* 는 내부 버퍼예요. 보관하려면 콜백 안에서 복사해야 해요 |
Example
예제의
ShowNoticeUI()는 SDK 가 제공하지 않는 가상 함수예요. 게임 UI 와 연결되는 부분이라 개발사가 직접 구현해야 해요.
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 성공 시 로직을 구현해 주세요. */
return;
}
if (Stove_IModuleAPICallbackResult_GetExternalError(callbackResult)
== k_EStoveGameCheckerForSteamResultCode_GameServerMaintenance)
{
const IModuleGameCheckerForSteamMaintenanceInfo* maintenanceInfo =
Stove_IModuleGameCheckerForSteamOutcome_GetMaintenanceInfo(result);
if (maintenanceInfo != NULL)
{
const wchar_t* title =
Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetTitle(maintenanceInfo);
const wchar_t* msg =
Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetMsg(maintenanceInfo);
int64_t endDt =
Stove_IModuleGameCheckerForSteamMaintenanceInfo_GetEndDt(maintenanceInfo);
/* 점검 안내 문구는 SDK 가 내려준 값을 그대로 씁니다. */
/* ShowNoticeUI 는 개발사가 구현하는 안내 화면입니다. */
ShowNoticeUI(title, /* 점검 공지 제목 — 화면 제목으로 씁니다. */
msg, /* 점검 공지 본문 — 본문으로 씁니다. */
endDt); /* 점검 종료 일시 (epoch 밀리초) — 표기 형식은 게임에서 정합니다. */
/* 사용자가 확인하면 게임을 종료합니다. 다시 호출해도 같은 결과가 나옵니다. */
}
}
/* maintenanceInfo 에는 Destroy() 를 호출하지 않습니다. */
}
Notes
- 점검 상황이 아닐 때도 이 객체 자체는 전달돼요. 값이 비어 있는 객체로 오지만 널 검사도 함께 하세요.
- 점검 여부는 이 객체의 값이 아니라 결과 코드(
GetExternalError()가503100)로 판단해요. UseYn은bool이 아니라"Y"/"N"문자열이에요.- 점검 중에는 게임 진입 체크를 다시 호출해도 같은 결과가 나와요. 안내 화면을 띄운 뒤 게임을 종료하는 흐름으로 처리하세요.
See Also
- IModuleGameCheckerForSteamOutcome
- IModuleGameCheckerForSteamRestrictInfo
- EStoveGameCheckerForSteamResultCode
IModuleGameCheckerForSteamMember
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
IModuleGameCheckerForSteamOutcome 의 GetMember() 로 얻는 회원 정보예요. 스토브 회원 번호 · 닉네임 · 가입 국가 · 인증 여부 · 가입 일시 등 계정 단위 정보를 담아요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
이 객체는 상위 결과 객체가 소유해요.
Destroy()를 호출하지 말고, 보관할 값은 콜백 안에서 복사해 두세요.
Declaration
typedef struct IModuleGameCheckerForSteamMember IModuleGameCheckerForSteamMember;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
AccountType | int32_t | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetAccountType() | 계정 유형 코드예요. 예를 들어 15 는 스팀 가입이에요. 값이 늘어날 수 있으므로 알 수 없는 값은 기타로 처리하세요. |
MemberNo | int64_t | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetMemberNo() | 스토브 회원 번호예요. 계정을 구분하는 고유 값이에요. |
ProviderCd | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetProviderCd() | 가입 경로(IDP) 코드예요(예: SO, FB, GP, STEAM, STEAM_SHADOW, VTCO). |
CountryCd | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetCountryCd() | 가입 국가 코드예요(ISO 3166-1 ALPHA-2). |
Nickname | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetNickname() | 스토브 닉네임이에요. |
PersonVerifyYn | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetPersonVerifyYn() | 본인 인증 여부예요. "Y" 또는 "N" 문자열이에요. |
ParentVerifyYn | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetParentVerifyYn() | 법정대리인 인증 여부예요. "Y" 또는 "N" 문자열이에요. |
EmailVerifyYn | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetEmailVerifyYn() | 이메일 인증 여부예요. "Y" 또는 "N" 문자열이에요. |
RegDt | int64_t | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetRegDt() | 가입 일시예요. 단위는 밀리초(Unix epoch)예요. |
BirthDt | int64_t | 읽기 | Stove_IModuleGameCheckerForSteamMember_GetBirthDt() | 생년월일이에요. 단위는 밀리초(Unix epoch)예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — 상위 결과 객체가 소유하며, 콜백이 반환되면 함께 무효가 돼요 |
| 문자열 | 반환되는 const wchar_t* 는 내부 버퍼예요. 보관하려면 콜백 안에서 복사해야 해요 |
Example
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (!Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 실패 시 로직을 구현해 주세요. */
return;
}
const IModuleGameCheckerForSteamMember* member =
Stove_IModuleGameCheckerForSteamOutcome_GetMember(result);
if (member != NULL)
{
int64_t memberNo = Stove_IModuleGameCheckerForSteamMember_GetMemberNo(member);
const wchar_t* nickname = Stove_IModuleGameCheckerForSteamMember_GetNickname(member);
const wchar_t* personVerifyYn =
Stove_IModuleGameCheckerForSteamMember_GetPersonVerifyYn(member);
/* 콜백 밖에서 쓸 값은 여기서 복사합니다. */
(void)memberNo;
(void)nickname;
(void)personVerifyYn;
}
/* member 에는 Destroy() 를 호출하지 않습니다. */
}
Notes
- 인증 여부 세 필드는
bool이 아니라"Y"/"N"문자열이에요. 비교할 때 문자열로 비교하세요. RegDt와BirthDt는 epoch 밀리초 값이에요. 화면에 표시할 형식으로 바꾸는 것은 게임 쪽에서 처리해요.- 계정 유형에 따라 연동 절차가 달라지지 않아요.
AccountType은 게임이 필요할 때만 참고하는 값이에요. - 게임 진입 체크가 실패하면 값이 비어 있는 객체로 전달돼요.
See Also
IModuleGameCheckerForSteamOutcome
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_GameCheckerForSteam 의 콜백 두 번째 인자로 전달되는 결과 데이터예요. 발급된 토큰과 만료 시간, 그리고 회원 정보 · 게임 유저 식별값 · 지역 정보 · 제재 정보 · 점검 정보를 하위 객체로 담아요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
토큰과 회원 정보는 성공했을 때만 채워져요. 제재 정보는 제재(403201), 점검 정보는 점검(503100) 상황에서 채워지며, 해당하지 않을 때는 값이 비어 있는 객체가 들어 있어요.
이 객체와 모든 하위 객체는 SDK 소유이며 콜백이 반환되는 순간 무효가 돼요.
Destroy()를 호출하지 말고, 보관할 값은 콜백 안에서 깊은 복사해 두세요. 문자열은 포인터만 넘어오므로 포인터를 저장하면 댕글링 포인터가 되어서 크래시의 원인이 될 수 있어요.
Declaration
typedef struct IModuleGameCheckerForSteamOutcome IModuleGameCheckerForSteamOutcome;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
AccessToken | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetAccessToken() | 발급된 스토브 액세스 토큰이에요. |
RefreshToken | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetRefreshToken() | 발급된 스토브 갱신 토큰이에요. |
ExpiresIn | int64_t | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetExpiresIn() | 액세스 토큰의 유효 시간이에요. 단위는 밀리초예요. |
ExpireIn | int32_t | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetExpireIn() | 액세스 토큰의 유효 시간이에요. 단위는 초예요. |
Member | const IModuleGameCheckerForSteamMember* | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetMember() | 로그인된 회원 정보예요. |
User | const IModuleGameCheckerForSteamUser* | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetUser() | 게임 유저 식별값과 가입 경로 목록이에요. |
GdsInfo | const IModuleGameCheckerForSteamGdsInfo* | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetGdsInfo() | 국가 · 규제 · 시간대 · 언어 정보예요. |
RestrictInfo | const IModuleGameCheckerForSteamRestrictInfo* | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetRestrictInfo() | 게임 이용 제재 정보예요. 제재 상황(403201)에서만 값이 채워져요. |
MaintenanceInfo | const IModuleGameCheckerForSteamMaintenanceInfo* | 읽기 | Stove_IModuleGameCheckerForSteamOutcome_GetMaintenanceInfo() | 게임 서버 점검 정보예요. 점검 상황(503100)에서만 값이 채워져요. |
하위 객체
하위 객체도 같은 규칙(Stove_<Interface>_<Method>)의 접근 함수를 제공해요. 멤버 구성은 각 문서를 참고하세요.
| Type | Content |
|---|---|
| IModuleGameCheckerForSteamMember | 회원 번호 · 닉네임 · 가입 국가 · 인증 여부 등 계정 정보 |
| IModuleGameCheckerForSteamUser | 서비스 식별자와 게임 유저 식별값 |
| IModuleGameCheckerForSteamGdsInfo | 국가 · 규제 · 시간대 · 언어 |
| IModuleGameCheckerForSteamRestrictInfo | 제재 기간 · 유형 · 사유 (403201) |
| IModuleGameCheckerForSteamMaintenanceInfo | 점검 기간 · 안내 제목 · 본문 (503100) |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 반환되면 무효) |
| 하위 객체 | 이 객체가 소유해요. 따로 해제하지 않아요 |
| 문자열 | 반환되는 const wchar_t* 는 이 객체의 내부 버퍼예요. 보관하려면 복사해야 해요 |
Example
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 토큰 — 보관하려면 복사합니다. */
const wchar_t* accessToken = Stove_IModuleGameCheckerForSteamOutcome_GetAccessToken(result);
int64_t expiresInMs = Stove_IModuleGameCheckerForSteamOutcome_GetExpiresIn(result);
(void)accessToken;
(void)expiresInMs;
/* 하위 객체 — 회원 정보 */
const IModuleGameCheckerForSteamMember* member =
Stove_IModuleGameCheckerForSteamOutcome_GetMember(result);
if (member != NULL)
{
int64_t memberNo = Stove_IModuleGameCheckerForSteamMember_GetMemberNo(member);
const wchar_t* nickname = Stove_IModuleGameCheckerForSteamMember_GetNickname(member);
(void)memberNo;
(void)nickname;
}
/* 게임 유저 식별값 */
const IModuleGameCheckerForSteamUser* user =
Stove_IModuleGameCheckerForSteamOutcome_GetUser(result);
if (user != NULL)
{
const wchar_t* userId = Stove_IModuleGameCheckerForSteamUser_GetUserId(user);
(void)userId;
}
return;
}
/* 제재 상황이면 제재 정보를 읽어 안내 화면에 씁니다. */
if (Stove_IModuleAPICallbackResult_GetExternalError(callbackResult)
== k_EStoveGameCheckerForSteamResultCode_GameRestrict)
{
const IModuleGameCheckerForSteamRestrictInfo* restrictInfo =
Stove_IModuleGameCheckerForSteamOutcome_GetRestrictInfo(result);
if (restrictInfo != NULL)
{
const wchar_t* label =
Stove_IModuleGameCheckerForSteamRestrictInfo_GetBanTypeLabel(restrictInfo);
(void)label;
}
}
/* result 와 모든 하위 객체는 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오. */
}
Notes
ExpiresIn(밀리초)과ExpireIn(초)은 이름이 한 글자만 다르고 단위가 달라요. 혼동하지 마세요.- 하위 객체는 해당 상황이 아니어도 값이 비어 있는 객체로 전달돼요. 그래도 널 검사를 함께 해 두는 편이 안전해요.
- 실패 사유는 이 객체가 아니라 콜백 첫 번째 인자의
Stove_IModuleAPICallbackResult_GetExternalError()로 판단해요. - 지역 정보(IModuleGameCheckerForSteamGdsInfo)에는 서버가 해석한 클라이언트 IP 를 돌려주는 멤버가 없어요.
See Also
- Stove_APIModule_GameCheckerForSteam
- IModuleGameCheckerForSteamParam
- EStoveGameCheckerForSteamResultCode
- 기본 연동 안내
IModuleGameCheckerForSteamParam
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_GameCheckerForSteam 호출에 필요한 파라미터를 담아요. 게임 ID 와 스팀 세션 토큰 두 값을 설정해요.
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam) 으로 만들고, 값을 채운 뒤 호출하고, 함수가 반환하면 Destroy() 로 해제해요. 비동기 함수이지만 SDK 가 호출 시점에 값을 복사하므로 콜백을 기다리지 않고 바로 해제할 수 있어요.
스팀 세션 토큰은 Steamworks 에서 프로세스당 한 번 발급받아 게임 세션 동안 그대로 재사용해요. 호출할 때마다 새로 발급받을 필요는 없어요.
Declaration
typedef struct IModuleGameCheckerForSteamParam IModuleGameCheckerForSteamParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
GameId | const wchar_t* | 읽기·쓰기 | Stove_IModuleGameCheckerForSteamParam_GetGameId() / SetGameId() | 스토브 플랫폼에 게임을 등록할 때 발급되는 고유 ID 예요. |
SteamSessionToken | const wchar_t* | 읽기·쓰기 | Stove_IModuleGameCheckerForSteamParam_GetSteamSessionToken() / SetSteamSessionToken() | Steamworks ISteamUser::GetAuthTicketForWebApi 로 발급받은 세션 토큰이에요. 소문자 16진 문자열이며, 프로세스당 한 번 받아 게임 세션 동안 재사용해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) — 게임 진입 체크 함수가 반환한 뒤 해제해요 |
| 문자열 소유 | Set...() 에 넘긴 문자열은 파라미터 객체가 복사해 보관해요. 호출자 쪽 버퍼는 바로 정리해도 돼요 |
Example
IModuleGameCheckerForSteamParam* param =
(IModuleGameCheckerForSteamParam*)Stove_APIModule_CreateParam(
k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam);
Stove_IModuleGameCheckerForSteamParam_SetGameId(param, L"YOUR_GAME_ID");
Stove_IModuleGameCheckerForSteamParam_SetSteamSessionToken(param, steamSessionToken);
Stove_APIModule_GameCheckerForSteam(param, OnGameCheckerFinished, NULL);
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
Notes
- 약관 미동의(
406401) 로 실패해 게임 진입 체크를 다시 호출할 때는 파라미터 객체를 새로 만들되, 스팀 세션 토큰은 처음 받은 값을 그대로 넣어요. - 초기화가 끝나기 전에 호출하면
k_EStoveModuleCommonResultCode_NotInitialized(10) 로 실패해요. - 파라미터를 해제한 뒤에도 요청은 정상적으로 진행돼요. 콜백이 올 때까지 객체를 살려 둘 필요가 없어요.
See Also
- Stove_APIModule_GameCheckerForSteam
- IModuleGameCheckerForSteamOutcome
- Stove_APIModule_CreateParam
- EStoveGameCheckerForSteamResultCode
IModuleGameCheckerForSteamRestrictInfo
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
IModuleGameCheckerForSteamOutcome 의 GetRestrictInfo() 로 얻는 이용 제재 정보예요. 제재 기간 · 제재 유형 · 사유를 담아요.
게임 진입 체크가 제재(k_EStoveGameCheckerForSteamResultCode_GameRestrict, 403201)로 실패했을 때 값이 채워져요. 그 밖의 상황에서는 값이 비어 있는 객체로 전달돼요.
제재 안내 화면은 개발사가 구현해요. 화면에 표시할 문구로는 현지화된 BanTypeLabel 과 사유 설명인 BlockReasonComment 를 쓸 수 있어요.
이 객체는 상위 결과 객체가 소유해요.
Destroy()를 호출하지 말고, 보관할 값은 콜백 안에서 복사해 두세요.
Declaration
typedef struct IModuleGameCheckerForSteamRestrictInfo IModuleGameCheckerForSteamRestrictInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
StartDt | int64_t | 읽기 | Stove_IModuleGameCheckerForSteamRestrictInfo_GetStartDt() | 제재 시작 일시예요. 단위는 밀리초(Unix epoch)예요. |
EndDt | int64_t | 읽기 | Stove_IModuleGameCheckerForSteamRestrictInfo_GetEndDt() | 제재 종료 일시예요. 단위는 밀리초(Unix epoch)예요. |
Type | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamRestrictInfo_GetType() | 제재 유형이에요. |
BlockReasonComment | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamRestrictInfo_GetBlockReasonComment() | 사람이 읽을 수 있는 제재 사유 설명이에요. |
BlockReasonCd | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamRestrictInfo_GetBlockReasonCd() | 제재 사유 코드예요. |
BanTypeLabel | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamRestrictInfo_GetBanTypeLabel() | 화면에 표시할 제재 유형 문구예요(현지화된 값). |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — 상위 결과 객체가 소유하며, 콜백이 반환되면 함께 무효가 돼요 |
| 문자열 | 반환되는 const wchar_t* 는 내부 버퍼예요. 보관하려면 콜백 안에서 복사해야 해요 |
Example
예제의
ShowNoticeUI()는 SDK 가 제공하지 않는 가상 함수예요. 게임 UI 와 연결되는 부분이라 개발사가 직접 구현해야 해요.
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 성공 시 로직을 구현해 주세요. */
return;
}
if (Stove_IModuleAPICallbackResult_GetExternalError(callbackResult)
== k_EStoveGameCheckerForSteamResultCode_GameRestrict)
{
const IModuleGameCheckerForSteamRestrictInfo* restrictInfo =
Stove_IModuleGameCheckerForSteamOutcome_GetRestrictInfo(result);
if (restrictInfo != NULL)
{
const wchar_t* banTypeLabel =
Stove_IModuleGameCheckerForSteamRestrictInfo_GetBanTypeLabel(restrictInfo);
const wchar_t* reason =
Stove_IModuleGameCheckerForSteamRestrictInfo_GetBlockReasonComment(restrictInfo);
int64_t endDt =
Stove_IModuleGameCheckerForSteamRestrictInfo_GetEndDt(restrictInfo);
/* 제재 안내 문구는 SDK 가 내려준 값을 그대로 씁니다. */
/* ShowNoticeUI 는 개발사가 구현하는 안내 화면입니다. */
ShowNoticeUI(banTypeLabel, /* 제재 유형 표시 문구 — 화면 제목으로 씁니다. */
reason, /* 제재 사유 — 본문으로 씁니다. */
endDt); /* 제재 종료 일시 (epoch 밀리초) — 표기 형식은 게임에서 정합니다. */
/* 사용자가 확인하면 게임을 종료합니다. 다시 호출해도 같은 결과가 나옵니다. */
}
}
/* restrictInfo 에는 Destroy() 를 호출하지 않습니다. */
}
Notes
- 제재 상황이 아닐 때도 이 객체 자체는 전달돼요. 값이 비어 있는 객체로 오지만 널 검사도 함께 하세요.
- 제재 여부는 이 객체의 값이 아니라 결과 코드(
GetExternalError()가403201)로 판단해요. - 영구 제재는
EndDt가 매우 먼 미래 값으로 올 수 있어요. 남은 기간을 계산해 표시할 때 상한을 두는 편이 안전해요. - 표시 문구가 필요하면
BanTypeLabel을 쓰세요.Type과BlockReasonCd는 게임 쪽 처리를 분기할 때 쓰는 코드성 값이에요.
See Also
- IModuleGameCheckerForSteamOutcome
- IModuleGameCheckerForSteamMaintenanceInfo
- EStoveGameCheckerForSteamResultCode
IModuleGameCheckerForSteamUser
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
IModuleGameCheckerForSteamOutcome 의 GetUser() 로 얻는 게임 유저 정보예요. 게임 안에서 사용자를 구분하는 식별값과, 이 사용자가 연결한 가입 경로 목록을 담아요.
이 객체는 상위 결과 객체가 소유해요.
Destroy()를 호출하지 말고, 보관할 값은 콜백 안에서 복사해 두세요.
Declaration
typedef struct IModuleGameCheckerForSteamUser IModuleGameCheckerForSteamUser;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
ServiceId | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamUser_GetServiceId() | 스토브 서비스 식별자예요. |
UserId | const wchar_t* | 읽기 | Stove_IModuleGameCheckerForSteamUser_GetUserId() | 게임 유저 식별값(guid 문자열)이에요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — 상위 결과 객체가 소유하며, 콜백이 반환되면 함께 무효가 돼요 |
| 문자열 | 반환되는 const wchar_t* 는 내부 버퍼예요. 보관하려면 콜백 안에서 복사해야 해요 |
Example
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (!Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
/* 실패 시 로직을 구현해 주세요. */
return;
}
const IModuleGameCheckerForSteamUser* user =
Stove_IModuleGameCheckerForSteamOutcome_GetUser(result);
if (user != NULL)
{
const wchar_t* userId = Stove_IModuleGameCheckerForSteamUser_GetUserId(user);
(void)userId;
}
/* user 에는 Destroy() 를 호출하지 않습니다. */
}
Notes
- 게임 진입 체크가 실패하면 값이 비어 있는 객체로 전달돼요.
See Also
IModuleStoveGDSInfo
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
Stove_APIModule_GetGdsInfo 가 out 파라미터로 돌려주는 지역 정보예요. 접속 국가와 그 국가에 적용되는 규제, 시간대, 언어를 담아요.
국가는 서버가 접속 IP 로 판별해요. 판별하지 못하면 기본값이 채워지고 IsDefault 가 true 가 돼요.
동기 함수의 out 파라미터로 받는 객체이므로 호출자가 해제해야 해요. 게임 진입 체크 결과에 들어 있는 IModuleGameCheckerForSteamGdsInfo 와 멤버 구성은 같지만 타입과 해제 규칙이 달라요.
Declaration
typedef struct IModuleStoveGDSInfo IModuleStoveGDSInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
IsDefault | bool | 읽기 | Stove_IModuleStoveGDSInfo_GetIsDefault() | 국가를 판별하지 못해 기본값을 쓴 경우 true 예요. |
Nation | const wchar_t* | 읽기 | Stove_IModuleStoveGDSInfo_GetNation() | 국가 코드예요(ISO 3166-1 ALPHA-2). |
Regulation | const wchar_t* | 읽기 | Stove_IModuleStoveGDSInfo_GetRegulation() | 국가 코드에 따라 적용되는 규제 이름이에요(예: GDPR). |
Timezone | const wchar_t* | 읽기 | Stove_IModuleStoveGDSInfo_GetTimezone() | IANA TZDB 형식의 시간대 ID 예요(예: Asia/Seoul). |
UtcOffset | int32_t | 읽기 | Stove_IModuleStoveGDSInfo_GetUtcOffset() | 해당 시간대의 UTC 오프셋이에요. 단위는 분이에요 (한국 시간이면 540). |
Lang | const wchar_t* | 읽기 | Stove_IModuleStoveGDSInfo_GetLang() | 언어 코드예요(ISO 639-1 ALPHA-2). |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK (Stove_APIModule_GetGdsInfo() 의 out 파라미터) |
| 해제 책임 | 호출자 (Destroy() 필수) — 값을 다 읽은 뒤 해제해요 |
| 함께 해제할 객체 | 같은 호출이 반환한 IModuleAPIResult* 도 호출자가 해제해요 |
| 문자열 | 반환되는 const wchar_t* 는 이 객체의 내부 버퍼예요. 객체를 해제하면 무효가 되므로 보관하려면 복사해야 해요 |
Example
IModuleStoveGDSInfo* gdsInfo = NULL;
IModuleAPIResult* result = Stove_APIModule_GetGdsInfo(&gdsInfo);
if (Stove_IModuleAPIResult_IsSuccessful(result) && gdsInfo != NULL)
{
const wchar_t* nation = Stove_IModuleStoveGDSInfo_GetNation(gdsInfo);
const wchar_t* lang = Stove_IModuleStoveGDSInfo_GetLang(gdsInfo);
int32_t utcOffset = Stove_IModuleStoveGDSInfo_GetUtcOffset(gdsInfo);
(void)nation;
(void)lang;
(void)utcOffset;
/* 성공 시 로직을 구현해 주세요. */
}
else
{
/* 실패 시 로직을 구현해 주세요. */
}
if (gdsInfo != NULL)
{
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)gdsInfo);
}
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result);
Notes
UtcOffset의 단위는 분이에요. 시(hour)로 환산할 때는60으로 나누세요. 시간대를 정확히 다뤄야 하면 IANA 시간대 ID 인Timezone을 함께 쓰는 편이 안전해요.- 이 객체에는 서버가 해석한 클라이언트 IP 를 돌려주는 멤버가 없어요.
- out 파라미터와 반환값은 서로 다른 객체예요. 둘 다 해제해야 메모리가 새지 않아요.
- 호출이 실패하면 out 파라미터가 채워지지 않을 수 있어요. 널 검사를 먼저 하세요.
See Also
IModuleTypeBase
종류 구조체 · 모듈 APIModule · 버전 1.0.0
Description
APIModule 이 제공하는 모든 IModule* 오브젝트의 뿌리가 되는 인터페이스예요. 런타임 타입 확인, 해제 책임 확인, 해제, 확장 조회 네 가지 기능을 제공해요.
파라미터 객체 · 결과 객체 · 콜백으로 전달되는 데이터 객체가 모두 이 인터페이스를 상속하므로, 어떤 객체든 IModuleTypeBase* 로 캐스팅해 해제하거나 타입을 확인할 수 있어요.
해제 책임은 객체마다 달라요. ShouldDestroy() 가 true 를 반환하면 호출자가 Destroy() 로 해제해야 하고, false 면 SDK 가 소유하므로 해제하면 안 돼요.
Declaration
typedef struct IModuleTypeBase IModuleTypeBase;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
TypeKind | int32_t | 읽기 | Stove_IModuleTypeBase_GetTypeKind() | 런타임 타입 식별자예요. EStoveAPIModuleTypeKind 값과 대응해요. |
ShouldDestroy | bool | 읽기 | Stove_IModuleTypeBase_ShouldDestroy() | 호출자가 Destroy() 를 호출해야 하는 객체이면 true 예요. SDK 가 소유하는 객체이면 false 이에요. |
Destroy | void | 호출 | Stove_IModuleTypeBase_Destroy() | 객체를 해제해요. ShouldDestroy() 가 true 인 객체에만 호출해요. |
QueryExt | void* | 읽기 | Stove_IModuleTypeBase_QueryExt() | 확장 포인터를 조회해요. extId 는 확장 식별자이며, 0 과 1~0xFFFF 는 예약 구간, 0x10000 이상은 모듈이 정의하는 구간이에요. 현재 형상에서는 모든 식별자가 NULL 을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 객체마다 달라요. Stove_APIModule_CreateParam() 으로 만든 파라미터 객체와 동기 함수가 반환한 결과 객체는 호출자 소유이고, 콜백 인자로 받은 객체는 SDK 소유예요 |
| 해제 책임 | ShouldDestroy() 가 true 이면 호출자, false 이면 SDK |
| 판단 기준 | 출처를 외우지 않고 ShouldDestroy() 로 판단할 수 있어요 |
SDK 소유 객체에
Destroy()를 호출하면 안 돼요. 콜백 인자로 전달되는 IModuleAPICallbackResult 와IModuleXxxOutcome, 그 하위 객체가 여기에 해당해요.
Example
/* 어떤 IModule* 객체든 해제 여부를 같은 방식으로 판단할 수 있습니다. */
static void ReleaseIfNeeded(IModuleTypeBase* obj)
{
if (obj == NULL)
{
return;
}
if (Stove_IModuleTypeBase_ShouldDestroy(obj))
{
Stove_IModuleTypeBase_Destroy(obj);
}
}
void Sample(void)
{
IModuleTypeBase* param =
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam);
/* 타입 확인 */
if (Stove_IModuleTypeBase_GetTypeKind(param)
== k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam)
{
/* 파라미터를 설정하고 API 를 호출합니다. */
}
ReleaseIfNeeded(param);
}
Notes
Stove_APIModule_CreateParam()은IModuleTypeBase*를 반환해요. 사용할 때는 요청한 종류에 맞는 인터페이스 포인터로 캐스팅하고, 해제할 때는 다시IModuleTypeBase*로 캐스팅해요.Destroy()만 비 const 포인터를 받아요. 나머지 접근자는 모두const포인터를 받아요.- 해제한 객체의 포인터를 다시 쓰면 안 돼요. 해제 뒤에는
NULL로 초기화해 두는 편이 안전해요. QueryExt()는 후속 버전에서 인터페이스를 늘릴 때를 대비해 마련된 자리예요. 현재 형상에서 쓸 일은 없어요.
See Also
Stove_APIModule_AgreeToGameTermsForSteam
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
개발사 약관 화면에서 사용자가 동의한 결과를 서버에 제출해요. 게임 진입 체크가 406401(약관 동의 필요)로 실패했을 때, Stove_APIModule_FetchGameTermsForSteam() 으로 약관을 보여 주고 동의를 받은 다음 호출하는 함수예요.
이 호출이 성공하면 Stove_APIModule_GameCheckerForSteam() 을 다시 호출해 게임 진입 체크를 이어 가요.
Stove_APIModule_Initialize() 의 성공 콜백을 받은 뒤에 호출해요. 초기화 전에 호출하면 k_EStoveModuleCommonResultCode_NotInitialized(10) 로 실패해요. param 에 넣는 스팀 세션 토큰은 게임 진입 체크에 쓴 값을 그대로 넣어요.
비동기 함수예요. 결과는 onFinished 로 전달되며, 콜백을 받으려면 게임 루프에서 Stove_APIModule_RunCallback() 을 돌리고 있어야 해요.
서버가 내려주는 약관 동의 코드는
Stove_IModuleAPIResult_GetResultCode()가 아니라Stove_IModuleAPICallbackResult_GetExternalError()로 전달돼요. 결과 코드만 보고 분기하면 실패 원인을 구분할 수 없어요.
Declaration
void Stove_APIModule_AgreeToGameTermsForSteam(const IModuleAgreeToGameTermsForSteamParam* param, OnAPIModuleAgreeToGameTermsForSteamCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IModuleAgreeToGameTermsForSteamParam* | Y | 게임 ID 와 스팀 세션 토큰이에요. Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamParam) 으로 만들어요. |
onFinished | OnAPIModuleAgreeToGameTermsForSteamCallback | Y | 결과를 받을 콜백이에요. NULL 을 넘기면 요청은 나가지만 결과를 받을 수 없어요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. 쓰지 않으면 NULL 을 넘겨요. |
param 의 멤버는 다음과 같아요.
| Name | Type | Required | Accessor | Description |
|---|---|---|---|---|
GameId | const wchar_t* | Y | Stove_IModuleAgreeToGameTermsForSteamParam_SetGameId() | 스토브 플랫폼에 게임을 등록할 때 발급되는 고유 ID 예요. |
SteamSessionToken | const wchar_t* | Y | Stove_IModuleAgreeToGameTermsForSteamParam_SetSteamSessionToken() | Steamworks ISteamUser::GetAuthTicketForWebApi 로 발급받은 값이에요. 게임 진입 체크에 쓴 값과 같아요. |
Returns
없음
Callback
typedef void(STOVE_MODULE_API* OnAPIModuleAgreeToGameTermsForSteamCallback)(const IModuleAPICallbackResult* callbackResult, const IModuleAgreeToGameTermsForSteamOutcome* result);
| Name | Type | Description |
|---|---|---|
callbackResult | const IModuleAPICallbackResult* | 호출 결과예요. GetResult() 로 결과 코드를, GetExternalError() 로 약관 동의 코드를, GetErrorMsg() 로 서버 메시지를, GetUserData() 로 호출 시 넘긴 userData 를 꺼내요. |
result | const IModuleAgreeToGameTermsForSteamOutcome* | 동의 처리 결과예요. Stove_IModuleAgreeToGameTermsForSteamOutcome_GetGuid() 로 서버가 발급한 guid 를 꺼낼 수 있어요. 실패했을 때도 비어 있는 객체가 전달돼요. |
콜백은 Stove_APIModule_RunCallback() 을 호출한 스레드에서 실행돼요. SDK 내부 스레드가 아니에요. Stove_APIModule_RunCallback() 은 게임 UI(메인) 스레드에서 호출해야 해요.
콜백은 요청 하나당 한 번만 호출돼요.
Error Codes
Stove_IModuleAPIResult_GetResultCode() 로 얻는 값이에요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | 약관 동의가 처리되었어요. | x | |
| 1 | k_EStoveModuleCommonResultCode_Fail | 서버가 응답했으나 약관 동의가 실패했어요. 실제 사유는 GetExternalError() 에 담겨요. | x | |
| 2 | k_EStoveModuleCommonResultCode_InvalidParam | onFinished 가 NULL 이에요. 이 경우 콜백이 호출되지 않으므로 게임에서 관측할 수 없어요. | x | |
| 10 | k_EStoveModuleCommonResultCode_NotInitialized | 모듈이 초기화되지 않았어요. Stove_APIModule_Initialize() 성공 뒤에 호출하세요. | x | |
| 21 | k_EStoveModuleCommonResultCode_HttpError | 서버 응답의 HTTP 상태 코드가 200 이 아니에요. 이때도 서버가 내려준 코드는 GetExternalError() 에 담겨요. | O | |
| 22 | k_EStoveModuleCommonResultCode_ResponseError | 응답 본문을 해석할 수 없어요(형식 오류). | O | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 처리 중 알 수 없는 예외가 발생했어요. | O | |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 처리 중 예외가 발생했어요. | O |
약관 동의 코드는 Stove_IModuleAPICallbackResult_GetExternalError() 로 전달돼요. 전체 목록: EStoveAgreeToGameTermsForSteamResultCode
전체 목록: EStoveModuleCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param) 필수. 함수가 반환한 뒤 바로 해제해도 돼요 |
콜백의 callbackResult, result | SDK | 해제 금지. 콜백이 반환되면 무효처리돼요 |
callbackResult 의 하위 객체 (GetResult()) | SDK | 해제 금지. 부모 객체가 소유해요 |
userData 가 가리키는 메모리 | 호출자 | SDK 는 관여하지 않아요. 콜백이 호출될 때까지 수명을 유지하세요 |
Example
void __cdecl OnAgreeToGameTermsFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleAgreeToGameTermsForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
// 성공 — 같은 스팀 세션 토큰으로
// Stove_APIModule_GameCheckerForSteam() 을 다시 호출합니다.
return;
}
// 실패 시 로직을 구현해 주세요.
// int32_t agreeCode = Stove_IModuleAPICallbackResult_GetExternalError(callbackResult);
}
void SubmitGameTermsAgreement(const wchar_t* gameId, const wchar_t* steamSessionToken)
{
IModuleAgreeToGameTermsForSteamParam* param = (IModuleAgreeToGameTermsForSteamParam*)
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamParam);
Stove_IModuleAgreeToGameTermsForSteamParam_SetGameId(param, gameId);
Stove_IModuleAgreeToGameTermsForSteamParam_SetSteamSessionToken(param, steamSessionToken);
Stove_APIModule_AgreeToGameTermsForSteam(param, OnAgreeToGameTermsFinished, NULL);
// 호출자가 만든 객체이므로 반드시 해제합니다.
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
}
// 게임 루프에서 매 프레임 호출 (게임 UI 스레드)
// Stove_APIModule_RunCallback();
Notes
- 동의 제출은 항목 단위가 아니라 게임 단위예요. 파라미터에는 게임 아이디와 스팀 세션 토큰만 넣으며, 어떤 항목에 동의했는지는 보내지 않아요. 화면에 체크박스를 항목별로 두더라도 제출은 한 번만 해요.
- 사용자가 필수 약관에 동의한 경우에만 호출하세요. 이 함수는 동의 여부를 판단하지 않고 제출만 해요.
- 스팀 세션 토큰은 게임 진입 체크에 쓴 값을 그대로 넣어요. 프로세스당 한 번 발급받아 게임 세션 동안 재사용하는 값이에요.
- 성공한 뒤에는 게임 진입 체크를 다시 호출해요. 이때도 같은 토큰을 써요.
GetGuid()로 얻는 값은 스토브 내부 처리에 쓰이는 식별값이에요. 게임이 해석하거나 보관할 필요는 없어요.- 콜백 안에서 보관할 문자열은 반드시 복사해 두세요. 콜백이 반환되면 포인터가 무효가 돼요.
See Also
- Stove_APIModule_FetchGameTermsForSteam
- Stove_APIModule_GameCheckerForSteam
- IModuleAgreeToGameTermsForSteamOutcome
- EStoveAgreeToGameTermsForSteamResultCode
- 기본 연동 안내
Stove_APIModule_CreateParam
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
APIModule 의 모든 파라미터 객체는 이 함수 하나로 만들어요. kind 에 지정한 값에 대응하는 객체를 생성해 IModuleTypeBase* 로 돌려주며, 게임은 이를 원하는 파라미터 타입으로 캐스팅해 값을 채운 뒤 API 에 넘겨요.
파라미터 계열 kind 는 500 번대에 모여 있어요. 결과·데이터 계열 값(0~30)이나 알 수 없는 값을 넘기면 오류로 처리되지 않고 NULL 을 반환하므로, 반환값을 먼저 확인해야 해요.
이 함수로 만든 객체는 호출자 소유예요. API 에 넘긴 뒤에도 소유권은 그대로 호출자에게 남으므로 반드시 직접 해제해야 해요.
Declaration
IModuleTypeBase* Stove_APIModule_CreateParam(EStoveAPIModuleTypeKind kind);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
kind | EStoveAPIModuleTypeKind | Y | 생성할 파라미터 객체의 종류예요. 500 번대 값만 유효해요. |
kind 에 넣을 수 있는 값은 다음과 같아요.
| Code | Name | Created Type |
|---|---|---|
| 500 | k_EStoveAPIModuleTypeKind_APIInitializeParam | IModuleAPIInitializeParam |
| 501 | k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam | IModuleGameCheckerForSteamParam |
| 502 | k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamParam | IModuleFetchGameTermsForSteamParam |
| 503 | k_EStoveAPIModuleTypeKind_AgreeToGameTermsForSteamParam | IModuleAgreeToGameTermsForSteamParam |
Returns
| Type | Description |
|---|---|
IModuleTypeBase* | 생성된 객체 포인터예요. kind 가 파라미터 계열이 아니거나 알 수 없는 값이면 NULL 을 반환해요. |
Error Codes
없음. 이 함수는 IModuleAPIResult 를 반환하지 않는 팩토리 함수이며, 실패 여부는 반환값이 NULL 인지로만 판단해요.
Memory Management
| Object | Owner | Release |
|---|---|---|
반환된 IModuleTypeBase* | 호출자 | Stove_IModuleTypeBase_Destroy() 필수. API 에 넘긴 뒤에도 소유권은 호출자에게 있어요 |
Example
IModuleTypeBase* base = Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam);
if (base != NULL)
{
IModuleGameCheckerForSteamParam* param = (IModuleGameCheckerForSteamParam*)base;
Stove_IModuleGameCheckerForSteamParam_SetGameId(param, L"YOUR_GAME_ID");
Stove_IModuleGameCheckerForSteamParam_SetSteamSessionToken(param, steamSessionToken);
Stove_APIModule_GameCheckerForSteam(param, OnGameCheckerFinished, NULL);
// 호출자가 만든 객체이므로 반드시 해제합니다.
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
}
else
{
// kind 값이 잘못되었을 때의 처리 로직을 구현해 주세요.
}
Notes
- 반환값이
NULL인지 먼저 확인한 뒤 캐스팅하세요. - 비동기 API 에 넘긴 파라미터도 함수가 반환한 직후에 해제할 수 있어요. SDK 는 필요한 값을 호출 시점에 복사해요.
- 해제 여부가 헷갈리면
Stove_IModuleTypeBase_ShouldDestroy()로 확인할 수 있어요. 이 함수로 만든 객체는 항상true예요.
See Also
Stove_APIModule_FetchGameTermsForSteam
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
사용자에게 보여 줄 게임 약관의 제목과 본문을 조회해요. 게임 진입 체크가 406401(약관 동의 필요)로 실패했을 때, 개발사 동의 화면에 채울 내용을 받아 오는 함수예요.
약관 화면은 개발사가 직접 구현해요. 이 함수는 화면에 넣을 값만 제공하며, 동의 결과는 Stove_APIModule_AgreeToGameTermsForSteam() 으로 제출해요.
콜백으로 받은 항목의 값이 화면 어디에 들어가는지는 다음과 같아요. Title 은 약관 제목, Text 는 약관 본문, EnforcedDt 는 시행 일시, AgreeType 은 서버가 내려주는 분류값이에요. 화면 제목, 동의 체크박스 라벨, 버튼 라벨, 날짜 표기 형식은 SDK 가 내려주지 않으므로 개발사가 정해요.
Stove_APIModule_Initialize() 의 성공 콜백을 받은 뒤에 호출해요. 초기화 전에 호출하면 k_EStoveModuleCommonResultCode_NotInitialized(10) 로 실패해요.
비동기 함수예요. 결과는 onFinished 로 전달되며, 콜백을 받으려면 게임 루프에서 Stove_APIModule_RunCallback() 을 돌리고 있어야 해요.
약관 본문(
Text)은 HTML 로 전달돼요.스토브 파트너스에 입력된 값을 그대로 전달하므로 기본적으로 HTML 이 담겨 와요. 게임 UI 구현상 HTML 을 그대로 표시하기 어렵다면 평문으로 바꿔 받을 수 있으니 기술지원으로 문의해 주세요.
서버가 내려주는 약관 조회 코드는
Stove_IModuleAPIResult_GetResultCode()가 아니라Stove_IModuleAPICallbackResult_GetExternalError()로 전달돼요. 결과 코드만 보고 분기하면 실패 원인을 구분할 수 없어요.
Declaration
void Stove_APIModule_FetchGameTermsForSteam(const IModuleFetchGameTermsForSteamParam* param, OnAPIModuleFetchGameTermsForSteamCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IModuleFetchGameTermsForSteamParam* | Y | 게임 ID 와 약관 종류예요. Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamParam) 으로 만들어요. |
onFinished | OnAPIModuleFetchGameTermsForSteamCallback | Y | 결과를 받을 콜백이에요. NULL 을 넘기면 요청은 나가지만 결과를 받을 수 없어요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. 쓰지 않으면 NULL 을 넘겨요. |
param 의 멤버는 다음과 같아요.
| Name | Type | Required | Accessor | Description |
|---|---|---|---|---|
GameId | const wchar_t* | Y | Stove_IModuleFetchGameTermsForSteamParam_SetGameId() | 스토브 플랫폼에 게임을 등록할 때 발급되는 고유 ID 예요. |
AgType | int32_t | N | Stove_IModuleFetchGameTermsForSteamParam_SetAgType() | 조회할 약관의 종류예요. EStoveFetchGameTermsForSteamAgType 값을 넣어요. 지정하지 않으면 0 이 쓰이며 스팀 게임 서비스 약관이 조회돼요. |
Returns
없음
Callback
typedef void(STOVE_MODULE_API* OnAPIModuleFetchGameTermsForSteamCallback)(const IModuleAPICallbackResult* callbackResult, const IModuleFetchGameTermsForSteamOutcome* result);
| Name | Type | Description |
|---|---|---|
callbackResult | const IModuleAPICallbackResult* | 호출 결과예요. GetResult() 로 결과 코드를, GetExternalError() 로 약관 조회 코드를, GetErrorMsg() 로 서버 메시지를, GetUserData() 로 호출 시 넘긴 userData 를 꺼내요. |
result | const IModuleFetchGameTermsForSteamOutcome* | 조회한 약관 목록이에요. Stove_IModuleFetchGameTermsForSteamOutcome_GetContentCount() 로 개수를, GetContentAt(index) 로 항목을 꺼내요. 실패했을 때도 비어 있는 객체가 전달돼요. |
콜백은 Stove_APIModule_RunCallback() 을 호출한 스레드에서 실행돼요. SDK 내부 스레드가 아니에요. Stove_APIModule_RunCallback() 은 게임 UI(메인) 스레드에서 호출해야 해요.
콜백은 요청 하나당 한 번만 호출돼요.
Error Codes
Stove_IModuleAPIResult_GetResultCode() 로 얻는 값이에요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | 약관을 조회했어요. | x | |
| 1 | k_EStoveModuleCommonResultCode_Fail | 서버가 응답했으나 약관 조회가 실패했어요. 실제 사유는 GetExternalError() 에 담겨요. | x | |
| 2 | k_EStoveModuleCommonResultCode_InvalidParam | onFinished 가 NULL 이에요. 이 경우 콜백이 호출되지 않으므로 게임에서 관측할 수 없어요. | x | |
| 10 | k_EStoveModuleCommonResultCode_NotInitialized | 모듈이 초기화되지 않았어요. Stove_APIModule_Initialize() 성공 뒤에 호출하세요. | x | |
| 21 | k_EStoveModuleCommonResultCode_HttpError | 서버 응답의 HTTP 상태 코드가 200 이 아니에요. 이때도 서버가 내려준 코드는 GetExternalError() 에 담겨요. | O | |
| 22 | k_EStoveModuleCommonResultCode_ResponseError | 응답 본문을 해석할 수 없어요(형식 오류). | O | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 처리 중 알 수 없는 예외가 발생했어요. | O | |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 처리 중 예외가 발생했어요. | O |
약관 조회 코드는 Stove_IModuleAPICallbackResult_GetExternalError() 로 전달돼요. 전체 목록: EStoveFetchGameTermsForSteamResultCode
전체 목록: EStoveModuleCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param) 필수. 함수가 반환한 뒤 바로 해제해도 돼요 |
콜백의 callbackResult, result | SDK | 해제 금지. 콜백이 반환되면 무효처리돼요 |
result 의 하위 객체 (GetContentAt()) | SDK | 해제 금지. 부모 객체가 소유해요 |
userData 가 가리키는 메모리 | 호출자 | SDK 는 관여하지 않아요. 콜백이 호출될 때까지 수명을 유지하세요 |
Example
예제의
ShowGameTermsUI()는 SDK 가 제공하지 않는 가상 함수예요. 게임 UI 와 연결되는 부분이라 개발사가 직접 구현해야 해요.
// 약관 화면에 넘길 모델입니다. 콜백이 반환되면 SDK 포인터가 무효가 되므로 값을 복사해 둡니다.
typedef struct GameTermsItem
{
wchar_t* Title; // 약관 제목 — Title
wchar_t* Text; // 약관 본문 — Text
int64_t EnforcedDt; // 시행 일시 — EnforcedDt (epoch 밀리초)
int MustAgree; // 필수 동의 여부 — AgreeType 이 L"FIRST_MUST" 인지
} GameTermsItem;
#define MAX_GAME_TERMS 16
static GameTermsItem g_Terms[MAX_GAME_TERMS];
static uint32_t g_TermsCount = 0;
void __cdecl OnFetchGameTermsFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleFetchGameTermsForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (!Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
// 실패 시 로직을 구현해 주세요. 조회 코드는 GetExternalError() 로 확인합니다.
return;
}
uint32_t count = Stove_IModuleFetchGameTermsForSteamOutcome_GetContentCount(result);
g_TermsCount = 0;
for (uint32_t i = 0; i < count && g_TermsCount < MAX_GAME_TERMS; ++i)
{
const IModuleFetchGameTermsForSteamContent* content =
Stove_IModuleFetchGameTermsForSteamOutcome_GetContentAt(result, i);
if (content == NULL)
continue;
const wchar_t* title = Stove_IModuleFetchGameTermsForSteamContent_GetTitle(content);
const wchar_t* text = Stove_IModuleFetchGameTermsForSteamContent_GetText(content);
const wchar_t* agreeType = Stove_IModuleFetchGameTermsForSteamContent_GetAgreeType(content);
GameTermsItem* item = &g_Terms[g_TermsCount++];
item->Title = _wcsdup(title != NULL ? title : L"");
item->Text = _wcsdup(text != NULL ? text : L"");
item->EnforcedDt = Stove_IModuleFetchGameTermsForSteamContent_GetEnforcedDt(content);
item->MustAgree = (agreeType != NULL && wcscmp(agreeType, L"FIRST_MUST") == 0);
}
// 복사한 값으로 약관 화면을 띄웁니다. 화면은 개발사가 구현합니다.
// 동의 체크는 화면 아래쪽에 통합 동의 하나로 두고,
// 동의를 받으면 Stove_APIModule_AgreeToGameTermsForSteam() 으로 제출합니다.
ShowGameTermsUI(g_Terms, g_TermsCount);
}
void RequestGameTerms(const wchar_t* gameId)
{
IModuleFetchGameTermsForSteamParam* param = (IModuleFetchGameTermsForSteamParam*)
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_FetchGameTermsForSteamParam);
Stove_IModuleFetchGameTermsForSteamParam_SetGameId(param, gameId);
Stove_IModuleFetchGameTermsForSteamParam_SetAgType(param, k_EStoveFetchGameTermsForSteamAgType_Steam);
Stove_APIModule_FetchGameTermsForSteam(param, OnFetchGameTermsFinished, NULL);
// 호출자가 만든 객체이므로 반드시 해제합니다.
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
}
// 게임 루프에서 매 프레임 호출 (게임 UI 스레드)
// Stove_APIModule_RunCallback();
Notes
Stove_APIModule_Initialize()성공 콜백을 받은 뒤에 호출해요.- 약관 항목은 여러 개일 수 있어요.
GetContentCount()로 개수를 확인하고 전부 화면에 보여 주세요. - 항목마다 동의 유형이 달라요.
Stove_IModuleFetchGameTermsForSteamContent_GetAgreeType()값이L"FIRST_MUST"면 최초 동의가 필요한 약관,L"NONE"이면 그 분류에 해당하지 않는 항목이에요. 두 유형 모두 동의 대상이에요. - 약관 본문의 언어는 Stove_APIModule_SetLanguage() 로 설정한 값을 따라요. 약관을 조회하기 전에 언어를 맞춰 두세요.
- 콜백 안에서 보관할 문자열은 반드시 복사해 두세요. 콜백이 반환되면 포인터가 무효가 돼요.
- 동의 체크는 항목마다 두지 않고 화면 아래쪽에 통합 동의 하나로 둬요. 사용자가 동의하기 전에는 동의 버튼을 활성화하지 마세요.
- 동의 제출은 항목 단위가 아니라 게임 단위예요. 어떤 항목에 동의했는지는 서버로 보내지 않으므로, 화면에 체크박스를 항목별로 두더라도 제출은 한 번만 해요.
- 이 함수는 조회만 해요. 동의 처리는 Stove_APIModule_AgreeToGameTermsForSteam() 으로 별도 요청해야 해요.
See Also
- Stove_APIModule_AgreeToGameTermsForSteam
- IModuleFetchGameTermsForSteamOutcome
- EStoveFetchGameTermsForSteamAgType
- EStoveFetchGameTermsForSteamResultCode
- 기본 연동 안내
Stove_APIModule_GameCheckerForSteam
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
스팀 세션 토큰으로 스토브 플랫폼 인증을 처리하고, 이 사용자가 게임에 들어갈 수 있는 상태인지 확인해요. 로그인과 게임 진입 체크를 겸하는 단일 진입점이며, 성공하면 액세스 토큰 · 회원 정보 · 게임 유저 식별값 · 지역 정보를 한 번에 받아요.
Stove_APIModule_Initialize() 의 성공 콜백을 받은 뒤에 호출해요. 초기화 전에 호출하면 k_EStoveModuleCommonResultCode_NotInitialized(10) 로 실패해요. param 에 넣는 스팀 세션 토큰은 Steamworks 에서 프로세스당 한 번 발급받아 게임 세션 동안 재사용하는 값이에요.
비동기 함수예요. 결과는 onFinished 로 전달되며, 콜백을 받으려면 게임 루프에서 Stove_APIModule_RunCallback() 을 돌리고 있어야 해요.
성공하면 SDK 가 확보한 접속 정보를 내부적으로 PCSDK3 에 전달해요. 개발사가 토큰을 꺼내 PCSDK3 에 직접 넘기는 절차는 없어요.
서버가 내려주는 게임 진입 체크 코드(
406401등)는Stove_IModuleAPIResult_GetResultCode()가 아니라Stove_IModuleAPICallbackResult_GetExternalError()로 전달돼요. 결과 코드만 보고 분기하면 실패 원인을 구분할 수 없어요.
Declaration
void Stove_APIModule_GameCheckerForSteam(const IModuleGameCheckerForSteamParam* param, OnAPIModuleGameCheckerForSteamCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IModuleGameCheckerForSteamParam* | Y | 게임 ID 와 스팀 세션 토큰이에요. Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam) 으로 만들어요. |
onFinished | OnAPIModuleGameCheckerForSteamCallback | Y | 결과를 받을 콜백이에요. NULL 을 넘기면 요청은 나가지만 결과를 받을 수 없어요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. 쓰지 않으면 NULL 을 넘겨요. |
param 의 멤버는 다음과 같아요.
| Name | Type | Required | Accessor | Description |
|---|---|---|---|---|
GameId | const wchar_t* | Y | Stove_IModuleGameCheckerForSteamParam_SetGameId() | 스토브 플랫폼에 게임을 등록할 때 발급되는 고유 ID 예요. |
SteamSessionToken | const wchar_t* | Y | Stove_IModuleGameCheckerForSteamParam_SetSteamSessionToken() | Steamworks ISteamUser::GetAuthTicketForWebApi 로 발급받은 값이에요. 프로세스당 한 번 받아 재사용해요. |
Returns
없음
Callback
typedef void(STOVE_MODULE_API* OnAPIModuleGameCheckerForSteamCallback)(const IModuleAPICallbackResult* callbackResult, const IModuleGameCheckerForSteamOutcome* result);
| Name | Type | Description |
|---|---|---|
callbackResult | const IModuleAPICallbackResult* | 호출 결과예요. Stove_IModuleAPICallbackResult_GetResult() 로 결과 코드를, GetExternalError() 로 게임 진입 체크 코드를, GetErrorMsg() 로 서버 메시지를, GetUserData() 로 호출 시 넘긴 userData 를 꺼내요. |
result | const IModuleGameCheckerForSteamOutcome* | 게임 진입 체크 결과 데이터예요. 실패했을 때도 비어 있는 객체가 전달되며, 제재(403201)와 점검(503100) 상황에서는 해당 하위 정보가 채워져요. |
콜백은 Stove_APIModule_RunCallback() 을 호출한 스레드에서 실행돼요. SDK 내부 스레드가 아니에요. Stove_APIModule_RunCallback() 은 게임 UI(메인) 스레드에서 호출해야 해요.
콜백은 요청 하나당 한 번만 호출돼요.
Error Codes
Stove_IModuleAPIResult_GetResultCode() 로 얻는 값이에요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | 게임에 진입할 수 있어요. | x | |
| 1 | k_EStoveModuleCommonResultCode_Fail | 서버가 응답했으나 게임 진입 체크가 실패했어요. 실제 사유는 GetExternalError() 에 담겨요. | x | |
| 2 | k_EStoveModuleCommonResultCode_InvalidParam | onFinished 가 NULL 이에요. 이 경우 콜백이 호출되지 않으므로 게임에서 관측할 수 없어요. | x | |
| 10 | k_EStoveModuleCommonResultCode_NotInitialized | 모듈이 초기화되지 않았어요. Stove_APIModule_Initialize() 성공 뒤에 호출하세요. | x | |
| 21 | k_EStoveModuleCommonResultCode_HttpError | 서버 응답의 HTTP 상태 코드가 200 이 아니에요. 이때도 서버가 내려준 코드는 GetExternalError() 에 담겨요. | O | |
| 22 | k_EStoveModuleCommonResultCode_ResponseError | 응답 본문을 해석할 수 없어요(형식 오류). | O | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 처리 중 알 수 없는 예외가 발생했어요. | O | |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 처리 중 예외가 발생했어요. | O |
게임 진입 체크 코드는 Stove_IModuleAPICallbackResult_GetExternalError() 로 전달돼요. 전체 목록: EStoveGameCheckerForSteamResultCode
전체 목록: EStoveModuleCommonResultCode
406401(약관 동의 필요)을 제외한 모든 실패는 안내 화면을 띄운 뒤 게임을 종료해야 해요. 게임 진입 체크를 다시 호출하는 경우는406401하나뿐이에요.
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param) 필수. 함수가 반환한 뒤 바로 해제해도 돼요 |
콜백의 callbackResult, result | SDK | 해제 금지. 콜백이 반환되면 무효처리돼요 |
result 의 하위 객체 (GetMember(), GetUser() 등) | SDK | 해제 금지. 부모 객체가 소유해요 |
userData 가 가리키는 메모리 | 호출자 | SDK 는 관여하지 않아요. 콜백이 호출될 때까지 수명을 유지하세요 |
Example
void __cdecl OnGameCheckerFinished(const IModuleAPICallbackResult* callbackResult,
const IModuleGameCheckerForSteamOutcome* result)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
int32_t checkCode = Stove_IModuleAPICallbackResult_GetExternalError(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
// 성공 — 필요한 값을 복사해 둔 뒤 PCSDK3 를 기동합니다.
const wchar_t* accessToken = Stove_IModuleGameCheckerForSteamOutcome_GetAccessToken(result);
// wcscpy_s(myBuffer, _countof(myBuffer), accessToken); // 깊은 복사
(void)accessToken;
return;
}
if (checkCode == k_EStoveGameCheckerForSteamResultCode_NotAgreeTerms)
{
// 약관 동의 동선으로 진입합니다.
// Stove_APIModule_FetchGameTermsForSteam() -> 개발사 동의 화면
// -> Stove_APIModule_AgreeToGameTermsForSteam() -> 이 함수를 다시 호출
return;
}
// 그 밖의 실패 — 개발사 안내 화면을 띄운 뒤 게임을 종료합니다.
// const wchar_t* serverMessage = Stove_IModuleAPICallbackResult_GetErrorMsg(callbackResult);
}
void RequestGameChecker(const wchar_t* gameId, const wchar_t* steamSessionToken)
{
IModuleGameCheckerForSteamParam* param = (IModuleGameCheckerForSteamParam*)
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_GameCheckerForSteamParam);
Stove_IModuleGameCheckerForSteamParam_SetGameId(param, gameId);
Stove_IModuleGameCheckerForSteamParam_SetSteamSessionToken(param, steamSessionToken);
Stove_APIModule_GameCheckerForSteam(param, OnGameCheckerFinished, NULL);
// 호출자가 만든 객체이므로 반드시 해제합니다.
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
}
// 게임 루프에서 매 프레임 호출 (게임 UI 스레드)
// Stove_APIModule_RunCallback();
Notes
Stove_APIModule_Initialize()성공 콜백을 받은 뒤에 호출해요.- 스팀 세션 토큰은 프로세스당 한 번 발급받아 게임 세션 동안 재사용해요. 호출할 때마다 새로 받지 않아도 돼요.
- 약관 동의 뒤 이 함수를 다시 호출할 때도 같은 스팀 세션 토큰을 넣어요.
- 계정 유형(
AccountType)에 따라 처리를 나눌 필요가 없어요. 어떤 값이 와도 같은 방식으로 동작해요. - 실패했을 때도
result는 널이 아닌 빈 객체로 전달돼요. 값을 읽기 전에 결과 코드를 먼저 확인하세요. - 콜백 안에서 보관할 문자열은 반드시 복사해 두세요. 콜백이 반환되면 포인터가 무효가 돼요.
See Also
- Stove_APIModule_Initialize
- Stove_APIModule_FetchGameTermsForSteam
- Stove_APIModule_AgreeToGameTermsForSteam
- IModuleGameCheckerForSteamOutcome
- EStoveGameCheckerForSteamResultCode
- 기본 연동 안내
Stove_APIModule_GetGdsInfo
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
모듈이 보관 중인 GDS 정보를 조회해요. 접속 국가 · 적용 규제 · 시간대 · 언어가 담겨 있어, 지역별 안내나 시간 표기를 맞출 때 쓸 수 있어요.
GDS 정보는 초기화 과정에서 확보하며, 게임 진입 체크(Stove_APIModule_GameCheckerForSteam)가 성공하면 서버가 내려준 값으로 갱신돼요.
동기 함수예요. 반환된 IModuleAPIResult* 와 *outGdsInfo 는 둘 다 호출자가 해제해야 해요.
실패하더라도
outGdsInfo가NULL이 아니면 값이 비어 있는 객체가 채워져요. 결과 코드를 먼저 확인하고, 해제는 성공·실패와 상관없이 수행하세요.
Declaration
IModuleAPIResult* Stove_APIModule_GetGdsInfo(IModuleStoveGDSInfo** outGdsInfo);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
outGdsInfo | IModuleStoveGDSInfo** | Y | GDS 정보 포인터를 받을 변수예요. NULL 을 넘기면 2 로 실패하고 아무것도 채워지지 않아요. |
Returns
| Type | Description |
|---|---|
| IModuleAPIResult* | 호출 결과예요. Stove_IModuleAPIResult_IsSuccessful() 이 true 면 성공이에요. 사용 후 해제해야 해요. |
Error Codes
Stove_IModuleAPIResult_GetResultCode() 로 얻는 값이에요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | GDS 정보를 조회했어요. | x | |
| 2 | k_EStoveModuleCommonResultCode_InvalidParam | outGdsInfo 가 NULL 이에요. | x | |
| 10 | k_EStoveModuleCommonResultCode_NotInitialized | 모듈이 초기화되지 않았어요. Stove_APIModule_Initialize() 성공 뒤에 호출하세요. | x | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 처리 중 알 수 없는 예외가 발생했어요. | O | |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 처리 중 예외가 발생했어요. | O |
전체 목록: EStoveModuleCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
*outGdsInfo | SDK 가 생성, 소유권은 호출자로 이전 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)gdsInfo) 필수. 실패했을 때도 객체가 채워지므로 해제해야 해요 |
반환된 IModuleAPIResult* | 호출자 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result) 필수 |
Example
IModuleStoveGDSInfo* gdsInfo = NULL;
IModuleAPIResult* result = Stove_APIModule_GetGdsInfo(&gdsInfo);
if (Stove_IModuleAPIResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
const wchar_t* nation = Stove_IModuleStoveGDSInfo_GetNation(gdsInfo);
const wchar_t* timezone = Stove_IModuleStoveGDSInfo_GetTimezone(gdsInfo);
int32_t utcOffset = Stove_IModuleStoveGDSInfo_GetUtcOffset(gdsInfo);
(void)nation; (void)timezone; (void)utcOffset;
}
else
{
// 실패 시 로직을 구현해 주세요.
}
if (gdsInfo != NULL)
{
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)gdsInfo);
}
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result);
Notes
Stove_APIModule_Initialize()성공 콜백을 받은 뒤에 호출해요.- 국가 코드를 IP 로 판별하지 못해 기본값이 쓰인 경우
Stove_IModuleStoveGDSInfo_GetIsDefault()가true를 반환해요. GetUtcOffset()은 서버가 내려주는 값을 그대로 전달하며,GetTimezone()은L"Asia/Seoul"같은 IANA 시간대 ID 예요.- 게임 진입 체크 콜백에서도 같은 정보를 IModuleGameCheckerForSteamOutcome 의
GetGdsInfo()로 받을 수 있어요.
See Also
Stove_APIModule_GetVersion
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
모듈 바이너리의 버전 문자열을 게임이 준비한 버퍼로 복사해요. 오류를 문의할 때 함께 남겨 두면 원인 파악에 도움이 돼요.
초기화 여부를 확인하지 않으므로 Stove_APIModule_Initialize() 전에도 호출할 수 있어요.
동기 함수예요. 반환된 IModuleAPIResult* 는 호출자가 해제해야 해요.
Declaration
IModuleAPIResult* Stove_APIModule_GetVersion(wchar_t* outVersion, uint32_t length);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
outVersion | wchar_t* | Y | 버전 문자열을 받을 버퍼예요. NULL 을 넘기면 2 로 실패해요. |
length | uint32_t | Y | 버퍼 크기예요. 바이트가 아니라 wchar_t 개수로 넘겨요. 0 을 넘기면 2 로 실패해요. |
Returns
| Type | Description |
|---|---|
| IModuleAPIResult* | 호출 결과예요. Stove_IModuleAPIResult_IsSuccessful() 이 true 면 성공이에요. 사용 후 해제해야 해요. |
Error Codes
Stove_IModuleAPIResult_GetResultCode() 로 얻는 값이에요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | 버전 문자열을 복사했어요. | x | |
| 2 | k_EStoveModuleCommonResultCode_InvalidParam | outVersion 이 NULL 이거나 length 가 0 이거나, 버퍼가 작아 문자열이 잘렸어요. 잘린 경우 버퍼는 빈 문자열이 돼요. | x | |
| 251 | k_EStoveModuleCommonResultCode_PCSDKDllNotFound | 모듈 바이너리(APIModule.dll) 경로를 확인하지 못했어요. | O | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 처리 중 알 수 없는 예외가 발생했어요. | O | |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 처리 중 예외가 발생했어요. | O |
전체 목록: EStoveModuleCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
outVersion 버퍼 | 호출자 | 게임이 준비한 메모리예요. SDK 는 관여하지 않아요 |
반환된 IModuleAPIResult* | 호출자 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result) 필수 |
Example
wchar_t version[64] = { 0 };
IModuleAPIResult* result = Stove_APIModule_GetVersion(version, (uint32_t)(sizeof(version) / sizeof(wchar_t)));
if (Stove_IModuleAPIResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
// version 에 복사된 값을 로그에 남깁니다.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result);
Notes
length는wchar_t개수예요.sizeof(buffer)를 그대로 넘기지 마세요.- 초기화 전에도 호출할 수 있어요.
- 버퍼가 작아 문자열이 잘리면 버퍼를 빈 문자열로 되돌리고
2로 실패해요.
See Also
Stove_APIModule_Initialize
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
APIModule 을 초기화해요. 실행 환경 · 플랫폼 이름 · 스팀 앱 ID · 스팀 사용자 ID 를 넘기면 모듈이 서버 설정과 지역(GDS) 정보를 확보하고 내부 루프를 시작해요. 다른 모든 API 는 이 함수의 성공 콜백을 받은 뒤에 호출해요.
비동기 함수예요. 결과는 onFinished 로 전달되며, 콜백을 받으려면 게임 루프에서 Stove_APIModule_RunCallback() 을 돌리고 있어야 해요. 이 함수를 호출한 뒤에 루프를 시작해도 되지만, 루프를 돌리지 않으면 콜백이 영원히 오지 않아요.
파라미터 객체는 Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_APIInitializeParam) 으로 만들어요. 함수가 반환한 뒤 바로 해제해도 돼요.
초기화가 실패하면 이후 API 는 모두
k_EStoveModuleCommonResultCode_NotInitialized(10) 로 실패해요. 실패 콜백을 받으면 안내 화면을 띄운 뒤 게임을 종료하세요.
Declaration
void Stove_APIModule_Initialize(const IModuleAPIInitializeParam* param, OnAPIModuleInitializeCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IModuleAPIInitializeParam* | Y | 초기화 정보예요. Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_APIInitializeParam) 으로 만들어요. |
onFinished | OnAPIModuleInitializeCallback | Y | 결과를 받을 콜백이에요. NULL 을 넘기면 초기화 자체는 진행되지만 결과를 받을 수 없어요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. 쓰지 않으면 NULL 을 넘겨요. |
param 의 멤버는 다음과 같아요.
| Name | Type | Required | Accessor | Description |
|---|---|---|---|---|
Environment | const wchar_t* | Y | Stove_IModuleAPIInitializeParam_SetEnvironment() | 실행 환경이에요. 운영은 L"live", 개발·검증은 L"sandbox" 를 넣어요. 대소문자는 구분하지 않아요. |
PlatformName | const wchar_t* | Y | Stove_IModuleAPIInitializeParam_SetPlatformName() | 외부 플랫폼 이름이에요. L"STEAM" 고정값이에요. |
SteamAppId | const wchar_t* | Y | Stove_IModuleAPIInitializeParam_SetSteamAppId() | 스팀에 등록된 앱 ID 예요. 게임 진입 체크와 약관 동의 요청에 함께 전송돼요. |
SteamUserId | const wchar_t* | Y | Stove_IModuleAPIInitializeParam_SetSteamUserId() | 스팀 사용자 ID(SteamID)이에요. 게임 진입 체크와 약관 동의 요청에 함께 전송돼요. |
Returns
없음
Callback
typedef void(STOVE_MODULE_API* OnAPIModuleInitializeCallback)(const IModuleAPICallbackResult* callbackResult);
| Name | Type | Description |
|---|---|---|
callbackResult | const IModuleAPICallbackResult* | 호출 결과예요. Stove_IModuleAPICallbackResult_GetResult() 로 결과 코드를, GetErrorMsg() 로 오류 메시지를, GetUserData() 로 호출 시 넘긴 userData 를 꺼내요. |
초기화 콜백은 결과 데이터 없이 callbackResult 하나만 받아요.
콜백은 Stove_APIModule_RunCallback() 을 호출한 스레드에서 실행돼요. SDK 내부 스레드가 아니에요. Stove_APIModule_RunCallback() 은 게임 UI(메인) 스레드에서 호출해야 해요.
콜백은 요청 하나당 한 번만 호출돼요.
Error Codes
Stove_IModuleAPIResult_GetResultCode() 로 얻는 값이에요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | 초기화에 성공했어요. | x | |
| 1 | k_EStoveModuleCommonResultCode_Fail | 서버 설정 또는 지역(GDS) 정보를 가져오지 못했어요. | x | |
| 2 | k_EStoveModuleCommonResultCode_InvalidParam | Environment 가 비어 있거나 정해진 값이 아니에요(앞뒤 공백 포함). onFinished 가 NULL 인 경우에도 이 코드가 쓰이지만, 그때는 콜백이 호출되지 않으므로 게임에서 관측할 수 없어요. | x | |
| 11 | k_EStoveModuleCommonResultCode_AlreadyInitialized | 이미 초기화된 상태에서 다시 호출했어요. | x | |
| 251 | k_EStoveModuleCommonResultCode_PCSDKDllNotFound | 모듈 바이너리(APIModule.dll) 경로를 확인하지 못해 버전 검사에 실패했어요. | O | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 종류를 알 수 없는 예외가 발생했어요. 원인 문자열이 없어요. | O | |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 형식이 있는 예외가 발생했어요. 원인 문자열이 GetErrorMsg() 에 담겨요. | O |
전체 목록: EStoveModuleCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param) 필수. 함수가 반환한 뒤 바로 해제해도 돼요 |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 반환되면 무효처리돼요 |
callbackResult 의 하위 객체 (GetResult()) | SDK | 해제 금지. 부모 객체가 소유해요 |
userData 가 가리키는 메모리 | 호출자 | SDK 는 관여하지 않아요. 콜백이 호출될 때까지 수명을 유지하세요 |
Example
void __cdecl OnInitializeFinished(const IModuleAPICallbackResult* callbackResult)
{
const IModuleAPIResult* apiResult = Stove_IModuleAPICallbackResult_GetResult(callbackResult);
if (Stove_IModuleAPIResult_IsSuccessful(apiResult))
{
// 성공 시 로직을 구현해 주세요.
// 이어서 Stove_APIModule_GameCheckerForSteam() 을 호출합니다.
}
else
{
// 실패 시 로직을 구현해 주세요.
// const wchar_t* message = Stove_IModuleAPICallbackResult_GetErrorMsg(callbackResult);
}
}
void InitializeAPIModule(const wchar_t* steamAppId, const wchar_t* steamUserId)
{
IModuleAPIInitializeParam* param = (IModuleAPIInitializeParam*)
Stove_APIModule_CreateParam(k_EStoveAPIModuleTypeKind_APIInitializeParam);
Stove_IModuleAPIInitializeParam_SetEnvironment(param, L"live");
Stove_IModuleAPIInitializeParam_SetPlatformName(param, L"STEAM");
Stove_IModuleAPIInitializeParam_SetSteamAppId(param, steamAppId);
Stove_IModuleAPIInitializeParam_SetSteamUserId(param, steamUserId);
Stove_APIModule_Initialize(param, OnInitializeFinished, NULL);
// 호출자가 만든 객체이므로 반드시 해제합니다.
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)param);
}
// 게임 루프에서 매 프레임 호출 (게임 UI 스레드)
// Stove_APIModule_RunCallback();
Notes
- 초기화 성공 콜백을 받은 뒤에 Stove_APIModule_GameCheckerForSteam 을 호출해요.
Stove_APIModule_RunCallback()루프를 돌리지 않으면 초기화 콜백이 오지 않아요.- 플랫폼 이름은
L"STEAM"고정이에요. 스팀 외의 외부 플랫폼은 지원하지 않아요. Environment에 정해진 값이 아닌 문자열을 넣으면 초기화가2(InvalidParam)로 실패해요. 앞뒤 공백도 허용하지 않으므로, 설정 파일이나 커맨드라인에서 값을 읽어 온다면 공백을 다듬어 넣으세요. 대소문자는 가리지 않아요.- Steamworks SDK 초기화와 스팀 사용자 정보 조회는 게임 몫이에요. 이 모듈은 Steamworks SDK 를 포함하지 않아요.
- 이미 초기화된 상태에서 다시 호출하면
11로 실패해요. 초기화는 한 번만 호출하세요. - 종료할 때는 Stove_APIModule_UnInitialize() 를 호출해요.
See Also
- Stove_APIModule_UnInitialize
- Stove_APIModule_RunCallback
- Stove_APIModule_GameCheckerForSteam
- IModuleAPIInitializeParam
- 기본 연동 안내
Stove_APIModule_RunCallback
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
비동기 API 의 결과(콜백)를 처리해요. APIModule 의 모든 비동기 콜백은 이 함수를 통해서만 전달되며, SDK 내부 스레드가 아니라 이 함수를 호출한 스레드에서 실행돼요.
게임 UI(메인) 스레드에서 호출해야 해요. 그러면 콜백 안에서 게임 UI 를 바로 다룰 수 있고 별도의 동기화가 필요 없어요.
이 함수를 돌리지 않으면 콜백이 영원히 오지 않아요. 초기화 콜백도 마찬가지이므로, 연동을 시작하는 시점부터 게임 루프에서 계속 호출하세요.
게임 루프(매 프레임 또는 매 틱)에서 주기적으로 호출하는 함수예요. 이 함수만
while(true)로 반복 호출하는 방식으로 쓰지 않아요.
Declaration
void Stove_APIModule_RunCallback();
Parameters
없음
Returns
없음
Error Codes
없음. 이 함수는 결과 객체를 반환하지 않아요.
Memory Management
이 함수는 별도의 객체를 생성하거나 반환하지 않아요.
Example
// 게임 루프 예시 (게임 UI 스레드)
while (isGameRunning)
{
// ... 게임 로직 ...
Stove_APIModule_RunCallback();
// ... 렌더링 등 나머지 루프 로직 ...
}
Notes
- 모든 비동기 API 의 콜백은 이 함수를 호출한 스레드에서 실행돼요.
- 비동기 함수를 호출하기 전부터 루프를 돌리는 편이 안전해요.
- 대기 중인 콜백이 없으면 아무 일도 하지 않고 즉시 반환해요.
- Stove_APIModule_UnInitialize() 를 호출한 뒤에는 더 호출할 필요가 없어요.
See Also
Stove_APIModule_SetLanguage
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
모듈이 사용할 언어를 설정해요. 이 값은 서버 요청에 함께 전달되어, 약관 본문이나 서버 오류 메시지가 어떤 언어로 내려올지를 결정해요.
약관을 조회하기 전에 게임의 표시 언어와 맞춰 두세요. 설정하지 않으면 초기화 시점에 정해진 기본 언어가 쓰예요.
동기 함수예요. 반환된 IModuleAPIResult* 는 호출자가 해제해야 해요.
Declaration
IModuleAPIResult* Stove_APIModule_SetLanguage(const wchar_t* lang);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
lang | const wchar_t* | Y | BCP 47 형식의 언어 태그예요. 예: L"ko", L"en", L"ja". 대소문자는 구분하지 않아요. L"system" 을 넣으면 운영체제 언어를 따라요. |
Returns
| Type | Description |
|---|---|
| IModuleAPIResult* | 호출 결과예요. Stove_IModuleAPIResult_IsSuccessful() 이 true 면 성공이에요. 사용 후 해제해야 해요. |
Error Codes
Stove_IModuleAPIResult_GetResultCode() 로 얻는 값이에요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | 언어를 설정했어요. | x | |
| 2 | k_EStoveModuleCommonResultCode_InvalidParam | lang 이 NULL 이거나 비어 있거나, 지원하지 않는 언어 코드예요. 이 경우 언어 설정은 바뀌지 않아요. | x | |
| 10 | k_EStoveModuleCommonResultCode_NotInitialized | 모듈이 초기화되지 않았어요. Stove_APIModule_Initialize() 성공 뒤에 호출하세요. | x | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 처리 중 알 수 없는 예외가 발생했어요. | O | |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 처리 중 예외가 발생했어요. | O |
전체 목록: EStoveModuleCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
lang | 호출자 | 게임이 소유한 문자열이에요. SDK 가 값을 복사하므로 호출 뒤 해제해도 돼요 |
반환된 IModuleAPIResult* | 호출자 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result) 필수 |
Example
IModuleAPIResult* result = Stove_APIModule_SetLanguage(L"ko");
if (Stove_IModuleAPIResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result);
Notes
Stove_APIModule_Initialize()성공 콜백을 받은 뒤에 호출해요.- 지원하지 않는 언어 코드를 넣으면
2로 실패하고 기존 설정이 그대로 유지돼요. L"system"을 넣으면 운영체제 언어를 따르며, 운영체제 언어가 지원 목록에 없으면 영어(en)로 설정돼요.- 약관 조회(Stove_APIModule_FetchGameTermsForSteam)보다 먼저 호출해야 약관 본문이 원하는 언어로 내려와요.
See Also
Stove_APIModule_UnInitialize
종류 함수 · 모듈 APIModule · 버전 1.0.0
Description
APIModule 을 정리해요. 내부 루프와 통신 자원을 정리하고, 아직 처리되지 않은 콜백 큐를 비워요. Stove_APIModule_Initialize() 와 짝을 이루는 함수이며, 게임을 종료할 때 호출해요.
동기 함수예요. 반환된 IModuleAPIResult* 는 호출자가 해제해야 해요.
함수 이름은 대문자
I를 쓰는Stove_APIModule_UnInitialize예요.Uninitialize가 아니에요.
이 함수를 호출한 뒤에는 아직 전달되지 않은 콜백이 폐기돼요. 진행 중인 비동기 요청의 결과가 필요하다면 콜백을 받은 뒤에 호출하세요.
Declaration
IModuleAPIResult* Stove_APIModule_UnInitialize();
Parameters
없음
Returns
| Type | Description |
|---|---|
| IModuleAPIResult* | 호출 결과예요. Stove_IModuleAPIResult_IsSuccessful() 이 true 면 성공이에요. 사용 후 해제해야 해요. |
Error Codes
Stove_IModuleAPIResult_GetResultCode() 로 얻는 값이에요.
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveModuleCommonResultCode_Success | 정리에 성공했어요. | x | |
| 10 | k_EStoveModuleCommonResultCode_NotInitialized | 초기화되지 않은 상태에서 호출했어요. 이 경우에도 내부 정리 루틴은 계속 진행돼요. | x | |
| 253 | k_EStoveModuleCommonResultCode_UnmanagedException | 처리 중 알 수 없는 예외가 발생했어요. | O | |
| 254 | k_EStoveModuleCommonResultCode_ManagedException | 처리 중 예외가 발생했어요. | O |
전체 목록: EStoveModuleCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
반환된 IModuleAPIResult* | 호출자 | Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result) 필수 |
Example
IModuleAPIResult* result = Stove_APIModule_UnInitialize();
if (Stove_IModuleAPIResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IModuleTypeBase_Destroy((IModuleTypeBase*)result);
Notes
- 게임을 종료할 때 한 번 호출해요.
- 초기화되지 않은 상태에서 호출해도(
10) 내부 정리는 그대로 진행돼요. - 이 함수를 호출한 뒤에는
Stove_APIModule_RunCallback()을 더 호출할 필요가 없어요.