diff --git a/native/events.h b/native/events.h index 73bd848..22f3a10 100644 --- a/native/events.h +++ b/native/events.h @@ -16,6 +16,7 @@ EVENT_DECL( P2PSessionConnectionFail, P2PSessionConnectFail_t ) // ugc EVENT_DECL(DownloadItem, DownloadItemResult_t) EVENT_DECL(ItemInstalled, ItemInstalled_t) +EVENT_DECL(SubscribedItemsListChanged, UserSubscribedItemsListChanged_t) // -------------- OLD EVENTS ----------------------- #ifndef GLOBAL_EVENTS diff --git a/native/ugc.cpp b/native/ugc.cpp index d788a02..a4df65c 100644 --- a/native/ugc.cpp +++ b/native/ugc.cpp @@ -2,16 +2,25 @@ vdynamic *CallbackHandler::EncodeDownloadItem(DownloadItemResult_t *d) { HLValue v; + v.Set("appId", d->m_unAppID); v.Set("file", d->m_nPublishedFileId); + v.Set("result", (int)d->m_eResult); return v.value; } vdynamic *CallbackHandler::EncodeItemInstalled(ItemInstalled_t *d) { HLValue v; + v.Set("appId", d->m_unAppID); v.Set("file", d->m_nPublishedFileId); return v.value; } +vdynamic *CallbackHandler::EncodeSubscribedItemsListChanged(UserSubscribedItemsListChanged_t *d) { + HLValue v; + v.Set("appId", d->m_nAppID); + return v.value; +} + HL_PRIM varray *HL_NAME(get_subscribed_items)(){ if (!CheckInit()) return NULL; @@ -167,6 +176,35 @@ HL_PRIM CClosureCallResult* HL_NAME(get_app_dependen return m_call; } +HL_PRIM void HL_NAME(start_playtime_tracking)(varray *fileIDs){ + if (!CheckInit()) return; + + PublishedFileId_t * pvecPublishedFileID = new PublishedFileId_t[fileIDs->size]; + vuid *ids = hl_aptr(fileIDs, vuid); + for (int i = 0; i < fileIDs->size; i++) + pvecPublishedFileID[i] = ids[i] ? hl_to_uint64(ids[i]) : 0; + + SteamAPICall_t result = SteamUGC()->StartPlaytimeTracking(pvecPublishedFileID, fileIDs->size); + delete[] pvecPublishedFileID; +} + +HL_PRIM void HL_NAME(stop_playtime_tracking)(varray *fileIDs){ + if (!CheckInit()) return; + + PublishedFileId_t * pvecPublishedFileID = new PublishedFileId_t[fileIDs->size]; + vuid *ids = hl_aptr(fileIDs, vuid); + for (int i = 0; i < fileIDs->size; i++) + pvecPublishedFileID[i] = ids[i] ? hl_to_uint64(ids[i]) : 0; + + SteamAPICall_t result = SteamUGC()->StopPlaytimeTracking(pvecPublishedFileID, fileIDs->size); + delete[] pvecPublishedFileID; +} + +HL_PRIM void HL_NAME(stop_playtime_tracking_for_all_items)(){ + if (!CheckInit()) return; + SteamAPICall_t result = SteamUGC()->StopPlaytimeTrackingForAllItems(); +} + DEFINE_PRIM(_ARR, get_subscribed_items, _NO_ARG); DEFINE_PRIM(_I32, get_item_state, _UID); DEFINE_PRIM(_BOOL, get_item_download_info, _UID _REF(_F64) _REF(_F64)); @@ -178,6 +216,9 @@ DEFINE_PRIM(_CRESULT, delete_item, _UID _CALLB(_I32)); DEFINE_PRIM(_CRESULT, add_app_dependency, _UID _I32 _CALLB(_I32)); DEFINE_PRIM(_CRESULT, remove_app_dependency, _UID _I32 _CALLB(_I32)); DEFINE_PRIM(_CRESULT, get_app_dependencies, _UID _CALLB(_DYN)); +DEFINE_PRIM(_VOID, start_playtime_tracking, _ARR); +DEFINE_PRIM(_VOID, stop_playtime_tracking, _ARR); +DEFINE_PRIM(_VOID, stop_playtime_tracking_for_all_items, _NO_ARG); //----------------------------------------------------------------------------------------------------------- // UGC QUERY @@ -403,6 +444,7 @@ static void on_item_created(vclosure *c, CreateItemResult_t *result, bool error) HLValue v; v.Set("id", result->m_nPublishedFileId); v.Set("userNeedsLegalAgreement", result->m_bUserNeedsToAcceptWorkshopLegalAgreement); + v.Set("result", result->m_eResult); dyn_call_result(c, v.value, error); } else { @@ -424,18 +466,15 @@ HL_PRIM vuid HL_NAME(ugc_item_start_update)(int id, vuid itemID) { } static void on_item_updated(vclosure *c, SubmitItemUpdateResult_t *result, bool error) { - if (!error && result->m_eResult == k_EResultOK) { - vdynamic d; - d.t = &hlt_bool; - d.v.b = result->m_bUserNeedsToAcceptWorkshopLegalAgreement; - dyn_call_result(c, &d, error); - } - else { - vdynamic d; - d.t = &hlt_i32; - d.v.i = result->m_eResult; - dyn_call_result(c, &d, true); - } + HLValue v; + + v.Set("userNeedsLegalAgreement", result->m_bUserNeedsToAcceptWorkshopLegalAgreement); + v.Set("result", result->m_eResult); + + if (!error && result->m_eResult != k_EResultOK) + error = true; + + dyn_call_result(c, v.value, error); } HL_PRIM CClosureCallResult* HL_NAME(ugc_item_submit_update)(vuid updateHandle, vbyte *changeNotes, vclosure *closure){ @@ -503,7 +542,7 @@ HL_PRIM bool HL_NAME(ugc_item_set_preview_image)(vuid updateHandle, vbyte *path) DEFINE_PRIM(_CRESULT, ugc_item_create, _I32 _CALLB(_DYN)); DEFINE_PRIM(_UID, ugc_item_start_update, _I32 _UID); -DEFINE_PRIM(_CRESULT, ugc_item_submit_update, _UID _BYTES _CALLB(_BOOL)); +DEFINE_PRIM(_CRESULT, ugc_item_submit_update, _UID _BYTES _CALLB(_DYN)); DEFINE_PRIM(_BOOL, ugc_item_set_update_language, _UID _BYTES); DEFINE_PRIM(_BOOL, ugc_item_set_title, _UID _BYTES); DEFINE_PRIM(_BOOL, ugc_item_set_description, _UID _BYTES); diff --git a/steam/ugc/Item.hx b/steam/ugc/Item.hx index c9eccbc..ad28ea7 100644 --- a/steam/ugc/Item.hx +++ b/steam/ugc/Item.hx @@ -14,8 +14,9 @@ enum ItemState { class Item { public var id : UID; - public static var downloadedCallbacks = new ArrayVoid>(); + public static var downloadedCallbacks = new ArrayInt->Void>(); public static var installedCallbacks = new ArrayVoid>(); + public static dynamic function subscribedItemsListChanged() {} public static function fromInt( i : Int ){ var b = haxe.io.Bytes.alloc(8); @@ -23,30 +24,43 @@ class Item { return new Item(steam.UID.fromBytes(b)); } - public static function init( onDownloaded : Item -> Void, onInstalled : Item -> Void ){ + public static function init( onDownloaded : ( item:Item, result:Int ) -> Void, onInstalled : Item -> Void ){ downloadedCallbacks.push(onDownloaded); installedCallbacks.push(onInstalled); - Api.registerGlobalEvent(3400 + 6, function(data:{file:UID}){ + Api.registerGlobalEvent(3400 + 6, function(data:{appId:Int, file:UID, result:Int}){ + if (data.appId != Api.appId) + return; + var item = new Item(data.file); for( callback in downloadedCallbacks ){ - callback(item); + callback(item, data.result); } }); - Api.registerGlobalEvent(3400 + 5, function(data:{file:UID}){ + Api.registerGlobalEvent(3400 + 5, function(data:{appId:Int, file:UID}){ + if (data.appId != Api.appId) + return; + var item = new Item(data.file); for( callback in installedCallbacks ){ callback(item); } }); + + Api.registerGlobalEvent(3400 + 18, function(data:{appId:Int}){ + if (data.appId != Api.appId) + return; + + subscribedItemsListChanged(); + }); } - public static function create( appId : Int, cb : Null -> Bool -> Void ){ + public static function create( appId : Int, cb : ( id:Null, needsAgreement:Bool, result:Int ) -> Void ){ ugc_item_create(appId,function(obj, error){ if( error ){ - cb(null,false); + cb(null, false, obj.result); return; } - cb(new Item(obj.id), obj.userNeedsLegalAgreement); + cb(new Item(obj.id), obj.userNeedsLegalAgreement, obj.result); }); } @@ -55,6 +69,24 @@ class Item { return a == null ? null : [for( it in a ) new Item(it)]; } + public static function startPlaytimeTracking(ids:Array) { + var a = new hl.NativeArray(ids.length); + for( i in 0...ids.length ) + a[i] = ids[i].id; + start_playtime_tracking(a); + } + + public static function stopPlaytimeTracking(ids:Array) { + var a = new hl.NativeArray(ids.length); + for( i in 0...ids.length ) + a[i] = ids[i].id; + stop_playtime_tracking(a); + } + + public static function stopPlaytimeTrackingForAllItems() { + stop_playtime_tracking_for_all_items(); + } + inline function new( b : UID ){ id = b; } @@ -168,5 +200,14 @@ class Item { return null; } + static function start_playtime_tracking( ids : hl.NativeArray ) : Void { + } + + static function stop_playtime_tracking( ids : hl.NativeArray ) : Void { + } + + static function stop_playtime_tracking_for_all_items() : Void { + } + } diff --git a/steam/ugc/ItemUpdate.hx b/steam/ugc/ItemUpdate.hx index e26a269..8288917 100644 --- a/steam/ugc/ItemUpdate.hx +++ b/steam/ugc/ItemUpdate.hx @@ -16,8 +16,8 @@ class ItemUpdate { id = updId; } - public function submit( notes : String, cb : Bool -> Dynamic -> Void ){ - return ugc_item_submit_update(id,notes == null ? null : @:privateAccess notes.toUtf8(), function(needsAgreement,error) cb(!error,needsAgreement)); + public function submit( notes : String, cb : ( success:Bool, needsAgreement:Bool, result:Int ) -> Void ){ + return ugc_item_submit_update(id,notes == null ? null : @:privateAccess notes.toUtf8(), function(v:Dynamic,error) cb(!error,v.needsAgreement,v.result)); } public function setUpdateLanguage( lang : String ){ @@ -66,7 +66,7 @@ class ItemUpdate { // -- native static function ugc_item_start_update( appId : Int, itemId : UID ) : UID { return null; } - static function ugc_item_submit_update( updId : UID, notes : hl.Bytes, cb : Callback ) : AsyncCall { return null; } + static function ugc_item_submit_update( updId : UID, notes : hl.Bytes, cb : Callback ) : AsyncCall { return null; } static function ugc_item_set_update_language( updId : UID, lang : hl.Bytes ) : Bool { return false; } static function ugc_item_set_title( updId : UID, title : hl.Bytes ) : Bool { return false; } static function ugc_item_set_description( updId : UID, desc : hl.Bytes ) : Bool { return false; }