#ifndef __ACE_SDK_CLIENT_IMPL_H__ #define __ACE_SDK_CLIENT_IMPL_H__ #ifndef _WIN32 #error ACE Client SDK is only compatible with Windows programs now. #endif #include #include #include #define STRSAFE_NO_DEPRECATE #include #include "ace_sdk_common.h" #include "ace_sdk_account.h" struct __AceSdkClientPacket; struct __AceSdkClientLightFeaturePacket; struct __AceSdkClientLightFeature; typedef AceSdkResult(ACE_SDK_CALL* __AceSdkClientLogInRoutine)(void*, const char*, uint32_t, uint32_t, const char*); typedef AceSdkResult(ACE_SDK_CALL* __AceSdkClientLogOutRoutine)(void*); typedef AceSdkResult(ACE_SDK_CALL* __AceSdkClientDeinitRoutine)(void*); typedef AceSdkResult(ACE_SDK_CALL* __AceSdkClientGetPacketRoutine)(void*, struct __AceSdkClientPacket* out_packet); typedef AceSdkResult(ACE_SDK_CALL* __AceSdkClientOnPacketReceivedRoutine)(void*, const uint8_t*, uint32_t); typedef AceSdkResult(ACE_SDK_CALL* __AceSdkClientGetLightFeaturePacketRoutine)(void*, struct __AceSdkClientLightFeaturePacket*); typedef AceSdkResult(ACE_SDK_CALL* __AceSdkClientOnLightFeatureReceivedRoutine)(void*, const struct __AceSdkClientLightFeature*); typedef struct { void* handle_; void* deprecated1_; __AceSdkClientLogOutRoutine log_out_; __AceSdkClientDeinitRoutine deinit_; __AceSdkClientGetPacketRoutine get_packet_; __AceSdkClientOnPacketReceivedRoutine on_packet_received_; __AceSdkClientLogInRoutine log_in_; __AceSdkClientGetLightFeaturePacketRoutine get_light_feature_packet_; __AceSdkClientOnLightFeatureReceivedRoutine on_light_feature_received_; }__AceSdkClientObject; typedef struct { const ACE_CHAR* config_path_; }__AceSdkClientInitParams; #ifdef _MSC_VER __declspec(selectany) __AceSdkClientObject* __ace_sdk_client_object = NULL; #else __attribute__((weak)) __AceSdkClientObject* __ace_sdk_client_object = NULL; #endif #define __ACE_SDK_CLIENT_VERSION 9 inline int32_t __ace_sdk_get_exe_mod_path(ACE_CHAR* path, uint32_t len) { uint32_t ret = GetModuleFileNameW(NULL, path, len); if (ret == 0 || ret == len) { return -1; } ACE_CHAR* pos = wcsrchr(path, L'\\'); if (pos == NULL) { return -1; } *pos = L'\0'; return 0; } inline AceSdkResult ace_sdk_client_init() { ACE_CHAR full_path[1024]; if (__ace_sdk_get_exe_mod_path(full_path, ARRAYSIZE(full_path)) != 0) { return ACE_SDK_RESULT_CALC_PATH_FAILED; } #ifdef _WIN64 const ACE_CHAR* dll_path = L"\\AntiCheatExpert\\ACE-Base64.dll"; #else const ACE_CHAR* dll_path = L"\\AntiCheatExpert\\x86\\ACE-Base32.dll"; #endif if (FAILED(StringCchCatW(full_path, ARRAYSIZE(full_path), dll_path))) { return ACE_SDK_RESULT_CALC_PATH_FAILED; } int32_t ret = __ace_sdk_load_library(full_path); if (ret != 0) { return ACE_SDK_RESULT_LOAD_LIBRARY_FAILED; } typedef AceSdkResult(*InitRoutine)(uint32_t, const __AceSdkClientInitParams*, __AceSdkClientObject**); InitRoutine init = (InitRoutine)__ace_sdk_get_symbol("InitAceClient5"); if (init == NULL) { __ace_sdk_unload_library(); return ACE_SDK_RESULT_SYMBOL_NOT_FOUND; } return init(__ACE_SDK_CLIENT_VERSION, NULL, &__ace_sdk_client_object); } inline AceSdkResult ace_sdk_client_log_in(const char* account_id, AceSdkAccountType account_type, uint32_t world_id, const char* login_token) { if (__ace_sdk_client_object == NULL) { return ACE_SDK_RESULT_INIT_NOT_CALLED_OR_FAILED; } return __ace_sdk_client_object->log_in_(__ace_sdk_client_object->handle_, account_id, (uint32_t)account_type, world_id, login_token); } inline AceSdkResult ace_sdk_client_log_out() { if (__ace_sdk_client_object == NULL) { return ACE_SDK_RESULT_INIT_NOT_CALLED_OR_FAILED; } return __ace_sdk_client_object->log_out_(__ace_sdk_client_object->handle_); } inline AceSdkResult ace_sdk_client_deinit() { if (__ace_sdk_client_object == NULL) { return ACE_SDK_RESULT_INIT_NOT_CALLED_OR_FAILED; } AceSdkResult ret = __ace_sdk_client_object->deinit_(__ace_sdk_client_object->handle_); __ace_sdk_client_object = NULL; return ret; } inline AceSdkResult ace_sdk_client_get_packet(struct __AceSdkClientPacket* out_packet) { if (__ace_sdk_client_object == NULL) { return ACE_SDK_RESULT_INIT_NOT_CALLED_OR_FAILED; } return __ace_sdk_client_object->get_packet_(__ace_sdk_client_object->handle_, out_packet); } inline AceSdkResult ace_sdk_client_on_packet_received(const uint8_t* packet, uint32_t len) { if (__ace_sdk_client_object == NULL) { return ACE_SDK_RESULT_INIT_NOT_CALLED_OR_FAILED; } return __ace_sdk_client_object->on_packet_received_(__ace_sdk_client_object->handle_, packet, len); } inline AceSdkResult ace_sdk_client_get_light_feature_packet(struct __AceSdkClientLightFeaturePacket* out_packet) { if (__ace_sdk_client_object == NULL) { return ACE_SDK_RESULT_INIT_NOT_CALLED_OR_FAILED; } return __ace_sdk_client_object->get_light_feature_packet_(__ace_sdk_client_object->handle_, out_packet); } inline AceSdkResult ace_sdk_client_on_light_feature_received(const struct __AceSdkClientLightFeature* light_feature) { if (__ace_sdk_client_object == NULL) { return ACE_SDK_RESULT_INIT_NOT_CALLED_OR_FAILED; } return __ace_sdk_client_object->on_light_feature_received_(__ace_sdk_client_object->handle_, light_feature); } #endif