mirror of
https://github.com/mordentral/AdvancedSessionsPlugin.git
synced 2025-10-23 08:24:18 +00:00
Started adding in Steam Workshop support today
Former-commit-id: 61ccb9268f557fc3b9be093fde7b157d9a926bfd
This commit is contained in:
@@ -0,0 +1,55 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "OnlineSubSystemHeader.h"
|
||||||
|
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||||
|
#include "Online.h"
|
||||||
|
#include "OnlineSubsystem.h"
|
||||||
|
#include "OnlineSessionInterface.h"
|
||||||
|
|
||||||
|
#include "AdvancedSteamWorkshopLibrary.generated.h"
|
||||||
|
|
||||||
|
|
||||||
|
//General Advanced Sessions Log
|
||||||
|
DECLARE_LOG_CATEGORY_EXTERN(AdvancedSteamWorkshopLog, Log, All);
|
||||||
|
|
||||||
|
|
||||||
|
// Using a custom struct because uint32 isn't blueprint supported and I don't want to cast to int32
|
||||||
|
// due to the size of the workshop it could end up overflowing?
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FBPSteamWorkshopID
|
||||||
|
{
|
||||||
|
GENERATED_USTRUCT_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
uint32 SteamWorkshopID;
|
||||||
|
|
||||||
|
FBPSteamWorkshopID()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
FBPSteamWorkshopID(uint32 ID)
|
||||||
|
{
|
||||||
|
SteamWorkshopID = ID;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class UAdvancedSteamWorkshopLibrary : public UBlueprintFunctionLibrary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
public:
|
||||||
|
|
||||||
|
//********* Steam Functions *************//
|
||||||
|
|
||||||
|
// Returns IDs for subscribed workshop items, TArray length dictates how many
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedSteamWorkshop")
|
||||||
|
static TArray<FBPSteamWorkshopID> GetSubscribedWorkshopItems(int32 & NumberOfItems);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedSteamWorkshop")
|
||||||
|
static void GetNumSubscribedWorkshopItems(int32 & NumberOfItems);
|
||||||
|
|
||||||
|
};
|
@@ -0,0 +1,69 @@
|
|||||||
|
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro
|
||||||
|
|
||||||
|
// @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just
|
||||||
|
// disable the warnings locally. Remove when this is fixed in the SDK
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4996)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
|
||||||
|
|
||||||
|
#pragma push_macro("ARRAY_COUNT")
|
||||||
|
#undef ARRAY_COUNT
|
||||||
|
|
||||||
|
#include <steam/steam_api.h>
|
||||||
|
|
||||||
|
#pragma pop_macro("ARRAY_COUNT")
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// @todo Steam: See above
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "SteamWSRequestUGCDetailsCallbackProxy.generated.h"
|
||||||
|
|
||||||
|
UCLASS(MinimalAPI)
|
||||||
|
class USteamWSRequestUGCDetailsCallbackProxy : public UOnlineBlueprintCallProxyBase
|
||||||
|
{
|
||||||
|
GENERATED_UCLASS_BODY()
|
||||||
|
|
||||||
|
// Called when there is a successful results return
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FEmptyOnlineDelegate OnSuccess;
|
||||||
|
|
||||||
|
// Called when there is an unsuccessful results return
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FEmptyOnlineDelegate OnFailure;
|
||||||
|
|
||||||
|
// Ends the current session
|
||||||
|
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedSteamWorkshop")
|
||||||
|
static USteamWSRequestUGCDetailsCallbackProxy* GetWorkshopItemDetails(UObject* WorldContextObject, FBPSteamWorkshopID WorkShopID, int32 NumSecondsBeforeTimeout);
|
||||||
|
|
||||||
|
// UOnlineBlueprintCallProxyBase interface
|
||||||
|
virtual void Activate() override;
|
||||||
|
// End of UOnlineBlueprintCallProxyBase interface
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
|
||||||
|
// Internal callback when the operation completes, calls out to the public success/failure callbacks
|
||||||
|
/* Steam UGC details */
|
||||||
|
//STEAM_CALLBACK(USteamWSRequestUGCDetailsCallbackProxy, OnUGCRequestUGCDetails, SteamUGCRequestUGCDetailsResult_t, OnUGCRequestUGCDetailsCallback);
|
||||||
|
void OnUGCRequestUGCDetails(SteamUGCRequestUGCDetailsResult_t *pResult, bool bIOFailure);
|
||||||
|
CCallResult<USteamWSRequestUGCDetailsCallbackProxy, SteamUGCRequestUGCDetailsResult_t> m_callResultUGCRequestDetails;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
FBPSteamWorkshopID WorkShopID;
|
||||||
|
|
||||||
|
int32 NumSecondsBeforeTimeout;
|
||||||
|
|
||||||
|
UObject* WorldContextObject;
|
||||||
|
};
|
@@ -115,6 +115,8 @@ UTexture2D * UAdvancedFriendsLibrary::GetSteamFriendAvatar(const FBPUniqueNetId
|
|||||||
SteamUtils()->GetImageSize(Picture, &Width, &Height);
|
SteamUtils()->GetImageSize(Picture, &Width, &Height);
|
||||||
|
|
||||||
// STOLEN FROM ANSWERHUB :p, then fixed because answerhub wasn't releasing the memory O.o
|
// STOLEN FROM ANSWERHUB :p, then fixed because answerhub wasn't releasing the memory O.o
|
||||||
|
// Also fixed image pixel format and switched to a memcpy instead of manual iteration.
|
||||||
|
// At some point I should probably reply to that answerhub post with these fixes to prevent people killing their games.....
|
||||||
|
|
||||||
if (Width > 0 && Height > 0)
|
if (Width > 0 && Height > 0)
|
||||||
{
|
{
|
||||||
|
@@ -0,0 +1,95 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
#include "OnlineSubSystemHeader.h"
|
||||||
|
#include "SteamFuncs/AdvancedSteamWorkshopLibrary.h"
|
||||||
|
|
||||||
|
|
||||||
|
// This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro
|
||||||
|
// @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just
|
||||||
|
// disable the warnings locally. Remove when this is fixed in the SDK
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4996)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
|
||||||
|
|
||||||
|
#pragma push_macro("ARRAY_COUNT")
|
||||||
|
#undef ARRAY_COUNT
|
||||||
|
|
||||||
|
#include <steam/steam_api.h>
|
||||||
|
|
||||||
|
#pragma pop_macro("ARRAY_COUNT")
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// @todo Steam: See above
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//General Log
|
||||||
|
DEFINE_LOG_CATEGORY(AdvancedSteamWorkshopLog);
|
||||||
|
|
||||||
|
|
||||||
|
void UAdvancedSteamWorkshopLibrary::GetNumSubscribedWorkshopItems(int32 & NumberOfItems)
|
||||||
|
{
|
||||||
|
NumberOfItems = 0;
|
||||||
|
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
|
||||||
|
|
||||||
|
if (SteamAPI_Init())
|
||||||
|
{
|
||||||
|
NumberOfItems = SteamUGC()->GetNumSubscribedItems();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetNumSubscribedWorkshopItemCount : SteamAPI is not Inited!"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetNumSubscribedWorkshopItemCount : Called on an incompatible platform"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TArray<FBPSteamWorkshopID> UAdvancedSteamWorkshopLibrary::GetSubscribedWorkshopItems(int32 & NumberOfItems)
|
||||||
|
{
|
||||||
|
TArray<FBPSteamWorkshopID> outArray;
|
||||||
|
NumberOfItems = 0;
|
||||||
|
|
||||||
|
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
|
||||||
|
|
||||||
|
if (SteamAPI_Init())
|
||||||
|
{
|
||||||
|
uint32 NumItems = SteamUGC()->GetNumSubscribedItems();
|
||||||
|
|
||||||
|
if (NumItems == 0)
|
||||||
|
return outArray;
|
||||||
|
|
||||||
|
// Not using the actual variable above in case someone somehow goes past int32 limits
|
||||||
|
// Don't want to go negative on the iteration.
|
||||||
|
NumberOfItems = NumItems;
|
||||||
|
|
||||||
|
PublishedFileId_t *fileIds = new PublishedFileId_t[NumItems];
|
||||||
|
|
||||||
|
uint32 subItems = SteamUGC()->GetSubscribedItems(fileIds, NumItems);
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < subItems; ++i)
|
||||||
|
{
|
||||||
|
outArray.Add(FBPSteamWorkshopID(fileIds[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
delete fileIds;
|
||||||
|
|
||||||
|
return outArray;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetSubscribedWorkshopItemCount : SteamAPI is not Inited!"));
|
||||||
|
return outArray;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetSubscribedWorkshopItemCount : Called on an incompatible platform"));
|
||||||
|
return outArray;
|
||||||
|
}
|
@@ -0,0 +1,89 @@
|
|||||||
|
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "OnlineSubSystemHeader.h"
|
||||||
|
#include "SteamFuncs/SteamWSRequestUGCDetailsCallbackProxy.h"
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// UEndSessionCallbackProxy
|
||||||
|
|
||||||
|
USteamWSRequestUGCDetailsCallbackProxy::USteamWSRequestUGCDetailsCallbackProxy(const FObjectInitializer& ObjectInitializer)
|
||||||
|
: Super(ObjectInitializer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
USteamWSRequestUGCDetailsCallbackProxy* USteamWSRequestUGCDetailsCallbackProxy::GetWorkshopItemDetails(UObject* WorldContextObject, FBPSteamWorkshopID WorkShopID, int32 NumSecondsBeforeTimeout)
|
||||||
|
{
|
||||||
|
USteamWSRequestUGCDetailsCallbackProxy* Proxy = NewObject<USteamWSRequestUGCDetailsCallbackProxy>();
|
||||||
|
|
||||||
|
Proxy->WorkShopID = WorkShopID;
|
||||||
|
Proxy->NumSecondsBeforeTimeout = NumSecondsBeforeTimeout;
|
||||||
|
return Proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
void USteamWSRequestUGCDetailsCallbackProxy::Activate()
|
||||||
|
{
|
||||||
|
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
|
||||||
|
if (SteamAPI_Init())
|
||||||
|
{
|
||||||
|
SteamAPICall_t hSteamAPICall = SteamUGC()->RequestUGCDetails(WorkShopID.SteamWorkshopID, NumSecondsBeforeTimeout);
|
||||||
|
m_callResultUGCRequestDetails.Set(hSteamAPICall, this, &USteamWSRequestUGCDetailsCallbackProxy::OnUGCRequestUGCDetails);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
OnFailure.Broadcast();
|
||||||
|
}
|
||||||
|
|
||||||
|
void USteamWSRequestUGCDetailsCallbackProxy::OnUGCRequestUGCDetails(SteamUGCRequestUGCDetailsResult_t *pResult, bool bIOFailure)
|
||||||
|
{
|
||||||
|
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
|
||||||
|
|
||||||
|
if (bIOFailure)
|
||||||
|
{
|
||||||
|
OnFailure.Broadcast();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SteamUGCDetails_t hUGCDetails = pResult->m_details;
|
||||||
|
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Green, hUGCDetails.m_rgchTitle);
|
||||||
|
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Green, hUGCDetails.m_rgchDescription);
|
||||||
|
|
||||||
|
OnSuccess.Broadcast();
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
OnFailure.Broadcast();
|
||||||
|
/*
|
||||||
|
PublishedFileId_t m_nPublishedFileId;
|
||||||
|
EResult m_eResult; // The result of the operation.
|
||||||
|
EWorkshopFileType m_eFileType; // Type of the file
|
||||||
|
AppId_t m_nCreatorAppID; // ID of the app that created this file.
|
||||||
|
AppId_t m_nConsumerAppID; // ID of the app that will consume this file.
|
||||||
|
char m_rgchTitle[k_cchPublishedDocumentTitleMax]; // title of document
|
||||||
|
char m_rgchDescription[k_cchPublishedDocumentDescriptionMax]; // description of document
|
||||||
|
uint64 m_ulSteamIDOwner; // Steam ID of the user who created this content.
|
||||||
|
uint32 m_rtimeCreated; // time when the published file was created
|
||||||
|
uint32 m_rtimeUpdated; // time when the published file was last updated
|
||||||
|
uint32 m_rtimeAddedToUserList; // time when the user added the published file to their list (not always applicable)
|
||||||
|
ERemoteStoragePublishedFileVisibility m_eVisibility; // visibility
|
||||||
|
bool m_bBanned; // whether the file was banned
|
||||||
|
bool m_bAcceptedForUse; // developer has specifically flagged this item as accepted in the Workshop
|
||||||
|
bool m_bTagsTruncated; // whether the list of tags was too long to be returned in the provided buffer
|
||||||
|
char m_rgchTags[k_cchTagListMax]; // comma separated list of all tags associated with this file
|
||||||
|
// file/url information
|
||||||
|
UGCHandle_t m_hFile; // The handle of the primary file
|
||||||
|
UGCHandle_t m_hPreviewFile; // The handle of the preview file
|
||||||
|
char m_pchFileName[k_cchFilenameMax]; // The cloud filename of the primary file
|
||||||
|
int32 m_nFileSize; // Size of the primary file
|
||||||
|
int32 m_nPreviewFileSize; // Size of the preview file
|
||||||
|
char m_rgchURL[k_cchPublishedFileURLMax]; // URL (for a video or a website)
|
||||||
|
// voting information
|
||||||
|
uint32 m_unVotesUp; // number of votes up
|
||||||
|
uint32 m_unVotesDown; // number of votes down
|
||||||
|
float m_flScore; // calculated score
|
||||||
|
uint32 m_unNumChildren; // if m_eFileType == k_EWorkshopFileTypeCollection, then this number will be the number of children contained within the collection
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user