diff --git a/Assets/Plugins/Discord.meta b/Assets/Plugins/Discord.meta
new file mode 100644
index 000000000..dd04fd8fa
--- /dev/null
+++ b/Assets/Plugins/Discord.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5c02948e56fc801488f8e266ae84de7e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins.meta b/Assets/Plugins/Discord/Plugins.meta
new file mode 100644
index 000000000..244b317c5
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f9c0f41c6ce6e8d4e9efd06732127f2b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK.meta b/Assets/Plugins/Discord/Plugins/DiscordGameSDK.meta
new file mode 100644
index 000000000..f6651cc21
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8a63350dadfa3364ca113259df8a333a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ActivityManager.cs b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ActivityManager.cs
new file mode 100644
index 000000000..048e3b4b4
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ActivityManager.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace Discord
+{
+ public partial class ActivityManager
+ {
+ public void RegisterCommand()
+ {
+ RegisterCommand(null);
+ }
+ }
+}
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ActivityManager.cs.meta b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ActivityManager.cs.meta
new file mode 100644
index 000000000..52247252c
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ActivityManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6247f141a06f4c64bace3428adf1b1c3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Constants.cs b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Constants.cs
new file mode 100644
index 000000000..8e77e1ba1
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Constants.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Discord
+{
+ static class Constants
+ {
+ public const string DllName = "discord_game_sdk";
+ }
+}
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Constants.cs.meta b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Constants.cs.meta
new file mode 100644
index 000000000..1b3042d4f
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Constants.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a8beacc6f1e76b94da362fffb1e25e2e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Core.cs b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Core.cs
new file mode 100644
index 000000000..fa957657d
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Core.cs
@@ -0,0 +1,4199 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Discord
+{
+ public enum Result
+ {
+ Ok = 0,
+ ServiceUnavailable = 1,
+ InvalidVersion = 2,
+ LockFailed = 3,
+ InternalError = 4,
+ InvalidPayload = 5,
+ InvalidCommand = 6,
+ InvalidPermissions = 7,
+ NotFetched = 8,
+ NotFound = 9,
+ Conflict = 10,
+ InvalidSecret = 11,
+ InvalidJoinSecret = 12,
+ NoEligibleActivity = 13,
+ InvalidInvite = 14,
+ NotAuthenticated = 15,
+ InvalidAccessToken = 16,
+ ApplicationMismatch = 17,
+ InvalidDataUrl = 18,
+ InvalidBase64 = 19,
+ NotFiltered = 20,
+ LobbyFull = 21,
+ InvalidLobbySecret = 22,
+ InvalidFilename = 23,
+ InvalidFileSize = 24,
+ InvalidEntitlement = 25,
+ NotInstalled = 26,
+ NotRunning = 27,
+ InsufficientBuffer = 28,
+ PurchaseCanceled = 29,
+ InvalidGuild = 30,
+ InvalidEvent = 31,
+ InvalidChannel = 32,
+ InvalidOrigin = 33,
+ RateLimited = 34,
+ OAuth2Error = 35,
+ SelectChannelTimeout = 36,
+ GetGuildTimeout = 37,
+ SelectVoiceForceRequired = 38,
+ CaptureShortcutAlreadyListening = 39,
+ UnauthorizedForAchievement = 40,
+ InvalidGiftCode = 41,
+ PurchaseError = 42,
+ TransactionAborted = 43,
+ }
+
+ public enum CreateFlags
+ {
+ Default = 0,
+ NoRequireDiscord = 1,
+ }
+
+ public enum LogLevel
+ {
+ Error = 1,
+ Warn,
+ Info,
+ Debug,
+ }
+
+ public enum UserFlag
+ {
+ Partner = 2,
+ HypeSquadEvents = 4,
+ HypeSquadHouse1 = 64,
+ HypeSquadHouse2 = 128,
+ HypeSquadHouse3 = 256,
+ }
+
+ public enum PremiumType
+ {
+ None = 0,
+ Tier1 = 1,
+ Tier2 = 2,
+ }
+
+ public enum ImageType
+ {
+ User,
+ }
+
+ public enum ActivityType
+ {
+ Playing,
+ Streaming,
+ Listening,
+ Watching,
+ }
+
+ public enum ActivityActionType
+ {
+ Join = 1,
+ Spectate,
+ }
+
+ public enum ActivityJoinRequestReply
+ {
+ No,
+ Yes,
+ Ignore,
+ }
+
+ public enum Status
+ {
+ Offline = 0,
+ Online = 1,
+ Idle = 2,
+ DoNotDisturb = 3,
+ }
+
+ public enum RelationshipType
+ {
+ None,
+ Friend,
+ Blocked,
+ PendingIncoming,
+ PendingOutgoing,
+ Implicit,
+ }
+
+ public enum LobbyType
+ {
+ Private = 1,
+ Public,
+ }
+
+ public enum LobbySearchComparison
+ {
+ LessThanOrEqual = -2,
+ LessThan,
+ Equal,
+ GreaterThan,
+ GreaterThanOrEqual,
+ NotEqual,
+ }
+
+ public enum LobbySearchCast
+ {
+ String = 1,
+ Number,
+ }
+
+ public enum LobbySearchDistance
+ {
+ Local,
+ Default,
+ Extended,
+ Global,
+ }
+
+ public enum EntitlementType
+ {
+ Purchase = 1,
+ PremiumSubscription,
+ DeveloperGift,
+ TestModePurchase,
+ FreePurchase,
+ UserGift,
+ PremiumPurchase,
+ }
+
+ public enum SkuType
+ {
+ Application = 1,
+ DLC,
+ Consumable,
+ Bundle,
+ }
+
+ public enum InputModeType
+ {
+ VoiceActivity = 0,
+ PushToTalk,
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct User
+ {
+ public Int64 Id;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+ public string Username;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
+ public string Discriminator;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string Avatar;
+
+ public bool Bot;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct OAuth2Token
+ {
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string AccessToken;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
+ public string Scopes;
+
+ public Int64 Expires;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct ImageHandle
+ {
+ public ImageType Type;
+
+ public Int64 Id;
+
+ public UInt32 Size;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct ImageDimensions
+ {
+ public UInt32 Width;
+
+ public UInt32 Height;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct ActivityTimestamps
+ {
+ public Int64 Start;
+
+ public Int64 End;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct ActivityAssets
+ {
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string LargeImage;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string LargeText;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string SmallImage;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string SmallText;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct PartySize
+ {
+ public Int32 CurrentSize;
+
+ public Int32 MaxSize;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct ActivityParty
+ {
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string Id;
+
+ public PartySize Size;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct ActivitySecrets
+ {
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string Match;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string Join;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string Spectate;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct Activity
+ {
+ public ActivityType Type;
+
+ public Int64 ApplicationId;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string Name;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string State;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string Details;
+
+ public ActivityTimestamps Timestamps;
+
+ public ActivityAssets Assets;
+
+ public ActivityParty Party;
+
+ public ActivitySecrets Secrets;
+
+ public bool Instance;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct Presence
+ {
+ public Status Status;
+
+ public Activity Activity;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct Relationship
+ {
+ public RelationshipType Type;
+
+ public User User;
+
+ public Presence Presence;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct Lobby
+ {
+ public Int64 Id;
+
+ public LobbyType Type;
+
+ public Int64 OwnerId;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+ public string Secret;
+
+ public UInt32 Capacity;
+
+ public bool Locked;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct FileStat
+ {
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
+ public string Filename;
+
+ public UInt64 Size;
+
+ public UInt64 LastModified;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct Entitlement
+ {
+ public Int64 Id;
+
+ public EntitlementType Type;
+
+ public Int64 SkuId;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct SkuPrice
+ {
+ public UInt32 Amount;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
+ public string Currency;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct Sku
+ {
+ public Int64 Id;
+
+ public SkuType Type;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+ public string Name;
+
+ public SkuPrice Price;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct InputMode
+ {
+ public InputModeType Type;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+ public string Shortcut;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct UserAchievement
+ {
+ public Int64 UserId;
+
+ public Int64 AchievementId;
+
+ public byte PercentComplete;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
+ public string UnlockedAt;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct LobbyTransaction
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetTypeMethod(IntPtr methodsPtr, LobbyType type);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetOwnerMethod(IntPtr methodsPtr, Int64 ownerId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetCapacityMethod(IntPtr methodsPtr, UInt32 capacity);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetMetadataMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string key, [MarshalAs(UnmanagedType.LPStr)]string value);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result DeleteMetadataMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string key);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetLockedMethod(IntPtr methodsPtr, bool locked);
+
+ internal SetTypeMethod SetType;
+
+ internal SetOwnerMethod SetOwner;
+
+ internal SetCapacityMethod SetCapacity;
+
+ internal SetMetadataMethod SetMetadata;
+
+ internal DeleteMetadataMethod DeleteMetadata;
+
+ internal SetLockedMethod SetLocked;
+ }
+
+ internal IntPtr MethodsPtr;
+
+ internal Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public void SetType(LobbyType type)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.SetType(MethodsPtr, type);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void SetOwner(Int64 ownerId)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.SetOwner(MethodsPtr, ownerId);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void SetCapacity(UInt32 capacity)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.SetCapacity(MethodsPtr, capacity);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void SetMetadata(string key, string value)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.SetMetadata(MethodsPtr, key, value);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void DeleteMetadata(string key)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.DeleteMetadata(MethodsPtr, key);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void SetLocked(bool locked)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.SetLocked(MethodsPtr, locked);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct LobbyMemberTransaction
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetMetadataMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string key, [MarshalAs(UnmanagedType.LPStr)]string value);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result DeleteMetadataMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string key);
+
+ internal SetMetadataMethod SetMetadata;
+
+ internal DeleteMetadataMethod DeleteMetadata;
+ }
+
+ internal IntPtr MethodsPtr;
+
+ internal Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public void SetMetadata(string key, string value)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.SetMetadata(MethodsPtr, key, value);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void DeleteMetadata(string key)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.DeleteMetadata(MethodsPtr, key);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public partial struct LobbySearchQuery
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result FilterMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string key, LobbySearchComparison comparison, LobbySearchCast cast, [MarshalAs(UnmanagedType.LPStr)]string value);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SortMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string key, LobbySearchCast cast, [MarshalAs(UnmanagedType.LPStr)]string value);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result LimitMethod(IntPtr methodsPtr, UInt32 limit);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result DistanceMethod(IntPtr methodsPtr, LobbySearchDistance distance);
+
+ internal FilterMethod Filter;
+
+ internal SortMethod Sort;
+
+ internal LimitMethod Limit;
+
+ internal DistanceMethod Distance;
+ }
+
+ internal IntPtr MethodsPtr;
+
+ internal Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public void Filter(string key, LobbySearchComparison comparison, LobbySearchCast cast, string value)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.Filter(MethodsPtr, key, comparison, cast, value);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void Sort(string key, LobbySearchCast cast, string value)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.Sort(MethodsPtr, key, cast, value);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void Limit(UInt32 limit)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.Limit(MethodsPtr, limit);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public void Distance(LobbySearchDistance distance)
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ var res = Methods.Distance(MethodsPtr, distance);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+ }
+
+ public partial class ResultException : Exception
+ {
+ public readonly Result Result;
+
+ public ResultException(Result result) : base(result.ToString())
+ {
+ }
+ }
+
+ public partial class Discord : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void DestroyHandler(IntPtr MethodsPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result RunCallbacksMethod(IntPtr methodsPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SetLogHookCallback(IntPtr ptr, LogLevel level, [MarshalAs(UnmanagedType.LPStr)]string message);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SetLogHookMethod(IntPtr methodsPtr, LogLevel minLevel, IntPtr callbackData, SetLogHookCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetApplicationManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetUserManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetImageManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetActivityManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetRelationshipManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetLobbyManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetNetworkManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetOverlayManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetStorageManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetStoreManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetVoiceManagerMethod(IntPtr discordPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate IntPtr GetAchievementManagerMethod(IntPtr discordPtr);
+
+ internal DestroyHandler Destroy;
+
+ internal RunCallbacksMethod RunCallbacks;
+
+ internal SetLogHookMethod SetLogHook;
+
+ internal GetApplicationManagerMethod GetApplicationManager;
+
+ internal GetUserManagerMethod GetUserManager;
+
+ internal GetImageManagerMethod GetImageManager;
+
+ internal GetActivityManagerMethod GetActivityManager;
+
+ internal GetRelationshipManagerMethod GetRelationshipManager;
+
+ internal GetLobbyManagerMethod GetLobbyManager;
+
+ internal GetNetworkManagerMethod GetNetworkManager;
+
+ internal GetOverlayManagerMethod GetOverlayManager;
+
+ internal GetStorageManagerMethod GetStorageManager;
+
+ internal GetStoreManagerMethod GetStoreManager;
+
+ internal GetVoiceManagerMethod GetVoiceManager;
+
+ internal GetAchievementManagerMethod GetAchievementManager;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFICreateParams
+ {
+ internal Int64 ClientId;
+
+ internal UInt64 Flags;
+
+ internal IntPtr Events;
+
+ internal IntPtr EventData;
+
+ internal IntPtr ApplicationEvents;
+
+ internal UInt32 ApplicationVersion;
+
+ internal IntPtr UserEvents;
+
+ internal UInt32 UserVersion;
+
+ internal IntPtr ImageEvents;
+
+ internal UInt32 ImageVersion;
+
+ internal IntPtr ActivityEvents;
+
+ internal UInt32 ActivityVersion;
+
+ internal IntPtr RelationshipEvents;
+
+ internal UInt32 RelationshipVersion;
+
+ internal IntPtr LobbyEvents;
+
+ internal UInt32 LobbyVersion;
+
+ internal IntPtr NetworkEvents;
+
+ internal UInt32 NetworkVersion;
+
+ internal IntPtr OverlayEvents;
+
+ internal UInt32 OverlayVersion;
+
+ internal IntPtr StorageEvents;
+
+ internal UInt32 StorageVersion;
+
+ internal IntPtr StoreEvents;
+
+ internal UInt32 StoreVersion;
+
+ internal IntPtr VoiceEvents;
+
+ internal UInt32 VoiceVersion;
+
+ internal IntPtr AchievementEvents;
+
+ internal UInt32 AchievementVersion;
+ }
+
+ [DllImport(Constants.DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
+ private static extern Result DiscordCreate(UInt32 version, ref FFICreateParams createParams, out IntPtr manager);
+
+ public delegate void SetLogHookHandler(LogLevel level, string message);
+
+ private GCHandle SelfHandle;
+
+ private IntPtr EventsPtr;
+
+ private FFIEvents Events;
+
+ private IntPtr ApplicationEventsPtr;
+
+ private ApplicationManager.FFIEvents ApplicationEvents;
+
+ internal ApplicationManager ApplicationManagerInstance;
+
+ private IntPtr UserEventsPtr;
+
+ private UserManager.FFIEvents UserEvents;
+
+ internal UserManager UserManagerInstance;
+
+ private IntPtr ImageEventsPtr;
+
+ private ImageManager.FFIEvents ImageEvents;
+
+ internal ImageManager ImageManagerInstance;
+
+ private IntPtr ActivityEventsPtr;
+
+ private ActivityManager.FFIEvents ActivityEvents;
+
+ internal ActivityManager ActivityManagerInstance;
+
+ private IntPtr RelationshipEventsPtr;
+
+ private RelationshipManager.FFIEvents RelationshipEvents;
+
+ internal RelationshipManager RelationshipManagerInstance;
+
+ private IntPtr LobbyEventsPtr;
+
+ private LobbyManager.FFIEvents LobbyEvents;
+
+ internal LobbyManager LobbyManagerInstance;
+
+ private IntPtr NetworkEventsPtr;
+
+ private NetworkManager.FFIEvents NetworkEvents;
+
+ internal NetworkManager NetworkManagerInstance;
+
+ private IntPtr OverlayEventsPtr;
+
+ private OverlayManager.FFIEvents OverlayEvents;
+
+ internal OverlayManager OverlayManagerInstance;
+
+ private IntPtr StorageEventsPtr;
+
+ private StorageManager.FFIEvents StorageEvents;
+
+ internal StorageManager StorageManagerInstance;
+
+ private IntPtr StoreEventsPtr;
+
+ private StoreManager.FFIEvents StoreEvents;
+
+ internal StoreManager StoreManagerInstance;
+
+ private IntPtr VoiceEventsPtr;
+
+ private VoiceManager.FFIEvents VoiceEvents;
+
+ internal VoiceManager VoiceManagerInstance;
+
+ private IntPtr AchievementEventsPtr;
+
+ private AchievementManager.FFIEvents AchievementEvents;
+
+ internal AchievementManager AchievementManagerInstance;
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ private GCHandle? setLogHook;
+
+ public Discord(Int64 clientId, UInt64 flags)
+ {
+ FFICreateParams createParams;
+ createParams.ClientId = clientId;
+ createParams.Flags = flags;
+ Events = new FFIEvents();
+ EventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(Events));
+ createParams.Events = EventsPtr;
+ SelfHandle = GCHandle.Alloc(this);
+ createParams.EventData = GCHandle.ToIntPtr(SelfHandle);
+ ApplicationEvents = new ApplicationManager.FFIEvents();
+ ApplicationEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(ApplicationEvents));
+ createParams.ApplicationEvents = ApplicationEventsPtr;
+ createParams.ApplicationVersion = 1;
+ UserEvents = new UserManager.FFIEvents();
+ UserEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(UserEvents));
+ createParams.UserEvents = UserEventsPtr;
+ createParams.UserVersion = 1;
+ ImageEvents = new ImageManager.FFIEvents();
+ ImageEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(ImageEvents));
+ createParams.ImageEvents = ImageEventsPtr;
+ createParams.ImageVersion = 1;
+ ActivityEvents = new ActivityManager.FFIEvents();
+ ActivityEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(ActivityEvents));
+ createParams.ActivityEvents = ActivityEventsPtr;
+ createParams.ActivityVersion = 1;
+ RelationshipEvents = new RelationshipManager.FFIEvents();
+ RelationshipEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(RelationshipEvents));
+ createParams.RelationshipEvents = RelationshipEventsPtr;
+ createParams.RelationshipVersion = 1;
+ LobbyEvents = new LobbyManager.FFIEvents();
+ LobbyEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(LobbyEvents));
+ createParams.LobbyEvents = LobbyEventsPtr;
+ createParams.LobbyVersion = 1;
+ NetworkEvents = new NetworkManager.FFIEvents();
+ NetworkEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(NetworkEvents));
+ createParams.NetworkEvents = NetworkEventsPtr;
+ createParams.NetworkVersion = 1;
+ OverlayEvents = new OverlayManager.FFIEvents();
+ OverlayEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(OverlayEvents));
+ createParams.OverlayEvents = OverlayEventsPtr;
+ createParams.OverlayVersion = 1;
+ StorageEvents = new StorageManager.FFIEvents();
+ StorageEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(StorageEvents));
+ createParams.StorageEvents = StorageEventsPtr;
+ createParams.StorageVersion = 1;
+ StoreEvents = new StoreManager.FFIEvents();
+ StoreEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(StoreEvents));
+ createParams.StoreEvents = StoreEventsPtr;
+ createParams.StoreVersion = 1;
+ VoiceEvents = new VoiceManager.FFIEvents();
+ VoiceEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VoiceEvents));
+ createParams.VoiceEvents = VoiceEventsPtr;
+ createParams.VoiceVersion = 1;
+ AchievementEvents = new AchievementManager.FFIEvents();
+ AchievementEventsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(AchievementEvents));
+ createParams.AchievementEvents = AchievementEventsPtr;
+ createParams.AchievementVersion = 1;
+ InitEvents(EventsPtr, ref Events);
+ var result = DiscordCreate(2, ref createParams, out MethodsPtr);
+ if (result != Result.Ok)
+ {
+ Dispose();
+ throw new ResultException(result);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ public void Dispose()
+ {
+ if (MethodsPtr != IntPtr.Zero)
+ {
+ Methods.Destroy(MethodsPtr);
+ }
+ SelfHandle.Free();
+ Marshal.FreeHGlobal(EventsPtr);
+ Marshal.FreeHGlobal(ApplicationEventsPtr);
+ Marshal.FreeHGlobal(UserEventsPtr);
+ Marshal.FreeHGlobal(ImageEventsPtr);
+ Marshal.FreeHGlobal(ActivityEventsPtr);
+ Marshal.FreeHGlobal(RelationshipEventsPtr);
+ Marshal.FreeHGlobal(LobbyEventsPtr);
+ Marshal.FreeHGlobal(NetworkEventsPtr);
+ Marshal.FreeHGlobal(OverlayEventsPtr);
+ Marshal.FreeHGlobal(StorageEventsPtr);
+ Marshal.FreeHGlobal(StoreEventsPtr);
+ Marshal.FreeHGlobal(VoiceEventsPtr);
+ Marshal.FreeHGlobal(AchievementEventsPtr);
+ if (setLogHook.HasValue) {
+ setLogHook.Value.Free();
+ }
+ }
+
+ public void RunCallbacks()
+ {
+ var res = Methods.RunCallbacks(MethodsPtr);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void SetLogHookCallbackImpl(IntPtr ptr, LogLevel level, string message)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ SetLogHookHandler callback = (SetLogHookHandler)h.Target;
+ callback(level, message);
+ }
+
+ public void SetLogHook(LogLevel minLevel, SetLogHookHandler callback)
+ {
+ if (setLogHook.HasValue) {
+ setLogHook.Value.Free();
+ }
+ setLogHook = GCHandle.Alloc(callback);
+ Methods.SetLogHook(MethodsPtr, minLevel, GCHandle.ToIntPtr(setLogHook.Value), SetLogHookCallbackImpl);
+ }
+
+ public ApplicationManager GetApplicationManager()
+ {
+ if (ApplicationManagerInstance == null) {
+ ApplicationManagerInstance = new ApplicationManager(
+ Methods.GetApplicationManager(MethodsPtr),
+ ApplicationEventsPtr,
+ ref ApplicationEvents
+ );
+ }
+ return ApplicationManagerInstance;
+ }
+
+ public UserManager GetUserManager()
+ {
+ if (UserManagerInstance == null) {
+ UserManagerInstance = new UserManager(
+ Methods.GetUserManager(MethodsPtr),
+ UserEventsPtr,
+ ref UserEvents
+ );
+ }
+ return UserManagerInstance;
+ }
+
+ public ImageManager GetImageManager()
+ {
+ if (ImageManagerInstance == null) {
+ ImageManagerInstance = new ImageManager(
+ Methods.GetImageManager(MethodsPtr),
+ ImageEventsPtr,
+ ref ImageEvents
+ );
+ }
+ return ImageManagerInstance;
+ }
+
+ public ActivityManager GetActivityManager()
+ {
+ if (ActivityManagerInstance == null) {
+ ActivityManagerInstance = new ActivityManager(
+ Methods.GetActivityManager(MethodsPtr),
+ ActivityEventsPtr,
+ ref ActivityEvents
+ );
+ }
+ return ActivityManagerInstance;
+ }
+
+ public RelationshipManager GetRelationshipManager()
+ {
+ if (RelationshipManagerInstance == null) {
+ RelationshipManagerInstance = new RelationshipManager(
+ Methods.GetRelationshipManager(MethodsPtr),
+ RelationshipEventsPtr,
+ ref RelationshipEvents
+ );
+ }
+ return RelationshipManagerInstance;
+ }
+
+ public LobbyManager GetLobbyManager()
+ {
+ if (LobbyManagerInstance == null) {
+ LobbyManagerInstance = new LobbyManager(
+ Methods.GetLobbyManager(MethodsPtr),
+ LobbyEventsPtr,
+ ref LobbyEvents
+ );
+ }
+ return LobbyManagerInstance;
+ }
+
+ public NetworkManager GetNetworkManager()
+ {
+ if (NetworkManagerInstance == null) {
+ NetworkManagerInstance = new NetworkManager(
+ Methods.GetNetworkManager(MethodsPtr),
+ NetworkEventsPtr,
+ ref NetworkEvents
+ );
+ }
+ return NetworkManagerInstance;
+ }
+
+ public OverlayManager GetOverlayManager()
+ {
+ if (OverlayManagerInstance == null) {
+ OverlayManagerInstance = new OverlayManager(
+ Methods.GetOverlayManager(MethodsPtr),
+ OverlayEventsPtr,
+ ref OverlayEvents
+ );
+ }
+ return OverlayManagerInstance;
+ }
+
+ public StorageManager GetStorageManager()
+ {
+ if (StorageManagerInstance == null) {
+ StorageManagerInstance = new StorageManager(
+ Methods.GetStorageManager(MethodsPtr),
+ StorageEventsPtr,
+ ref StorageEvents
+ );
+ }
+ return StorageManagerInstance;
+ }
+
+ public StoreManager GetStoreManager()
+ {
+ if (StoreManagerInstance == null) {
+ StoreManagerInstance = new StoreManager(
+ Methods.GetStoreManager(MethodsPtr),
+ StoreEventsPtr,
+ ref StoreEvents
+ );
+ }
+ return StoreManagerInstance;
+ }
+
+ public VoiceManager GetVoiceManager()
+ {
+ if (VoiceManagerInstance == null) {
+ VoiceManagerInstance = new VoiceManager(
+ Methods.GetVoiceManager(MethodsPtr),
+ VoiceEventsPtr,
+ ref VoiceEvents
+ );
+ }
+ return VoiceManagerInstance;
+ }
+
+ public AchievementManager GetAchievementManager()
+ {
+ if (AchievementManagerInstance == null) {
+ AchievementManagerInstance = new AchievementManager(
+ Methods.GetAchievementManager(MethodsPtr),
+ AchievementEventsPtr,
+ ref AchievementEvents
+ );
+ }
+ return AchievementManagerInstance;
+ }
+ }
+
+ internal partial class MonoPInvokeCallbackAttribute : Attribute
+ {
+
+ }
+
+ public partial class ApplicationManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ValidateOrExitCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ValidateOrExitMethod(IntPtr methodsPtr, IntPtr callbackData, ValidateOrExitCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetCurrentLocaleMethod(IntPtr methodsPtr, StringBuilder locale);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetCurrentBranchMethod(IntPtr methodsPtr, StringBuilder branch);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetOAuth2TokenCallback(IntPtr ptr, Result result, ref OAuth2Token oauth2Token);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetOAuth2TokenMethod(IntPtr methodsPtr, IntPtr callbackData, GetOAuth2TokenCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetTicketCallback(IntPtr ptr, Result result, [MarshalAs(UnmanagedType.LPStr)]ref string data);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetTicketMethod(IntPtr methodsPtr, IntPtr callbackData, GetTicketCallback callback);
+
+ internal ValidateOrExitMethod ValidateOrExit;
+
+ internal GetCurrentLocaleMethod GetCurrentLocale;
+
+ internal GetCurrentBranchMethod GetCurrentBranch;
+
+ internal GetOAuth2TokenMethod GetOAuth2Token;
+
+ internal GetTicketMethod GetTicket;
+ }
+
+ public delegate void ValidateOrExitHandler(Result result);
+
+ public delegate void GetOAuth2TokenHandler(Result result, ref OAuth2Token oauth2Token);
+
+ public delegate void GetTicketHandler(Result result, ref string data);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ internal ApplicationManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ [MonoPInvokeCallback]
+ private static void ValidateOrExitCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ ValidateOrExitHandler callback = (ValidateOrExitHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void ValidateOrExit(ValidateOrExitHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.ValidateOrExit(MethodsPtr, GCHandle.ToIntPtr(wrapped), ValidateOrExitCallbackImpl);
+ }
+
+ public string GetCurrentLocale()
+ {
+ var ret = new StringBuilder(128);
+ Methods.GetCurrentLocale(MethodsPtr, ret);
+ return ret.ToString();
+ }
+
+ public string GetCurrentBranch()
+ {
+ var ret = new StringBuilder(4096);
+ Methods.GetCurrentBranch(MethodsPtr, ret);
+ return ret.ToString();
+ }
+
+ [MonoPInvokeCallback]
+ private static void GetOAuth2TokenCallbackImpl(IntPtr ptr, Result result, ref OAuth2Token oauth2Token)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ GetOAuth2TokenHandler callback = (GetOAuth2TokenHandler)h.Target;
+ h.Free();
+ callback(result, ref oauth2Token);
+ }
+
+ public void GetOAuth2Token(GetOAuth2TokenHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.GetOAuth2Token(MethodsPtr, GCHandle.ToIntPtr(wrapped), GetOAuth2TokenCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void GetTicketCallbackImpl(IntPtr ptr, Result result, ref string data)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ GetTicketHandler callback = (GetTicketHandler)h.Target;
+ h.Free();
+ callback(result, ref data);
+ }
+
+ public void GetTicket(GetTicketHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.GetTicket(MethodsPtr, GCHandle.ToIntPtr(wrapped), GetTicketCallbackImpl);
+ }
+ }
+
+ public partial class UserManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void CurrentUserUpdateHandler(IntPtr ptr);
+
+ internal CurrentUserUpdateHandler OnCurrentUserUpdate;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetCurrentUserMethod(IntPtr methodsPtr, ref User currentUser);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetUserCallback(IntPtr ptr, Result result, ref User user);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetUserMethod(IntPtr methodsPtr, Int64 userId, IntPtr callbackData, GetUserCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetCurrentUserPremiumTypeMethod(IntPtr methodsPtr, ref PremiumType premiumType);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result CurrentUserHasFlagMethod(IntPtr methodsPtr, UserFlag flag, ref bool hasFlag);
+
+ internal GetCurrentUserMethod GetCurrentUser;
+
+ internal GetUserMethod GetUser;
+
+ internal GetCurrentUserPremiumTypeMethod GetCurrentUserPremiumType;
+
+ internal CurrentUserHasFlagMethod CurrentUserHasFlag;
+ }
+
+ public delegate void GetUserHandler(Result result, ref User user);
+
+ public delegate void CurrentUserUpdateHandler();
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event CurrentUserUpdateHandler OnCurrentUserUpdate;
+
+ internal UserManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnCurrentUserUpdate = OnCurrentUserUpdateImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ public User GetCurrentUser()
+ {
+ var ret = new User();
+ var res = Methods.GetCurrentUser(MethodsPtr, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void GetUserCallbackImpl(IntPtr ptr, Result result, ref User user)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ GetUserHandler callback = (GetUserHandler)h.Target;
+ h.Free();
+ callback(result, ref user);
+ }
+
+ public void GetUser(Int64 userId, GetUserHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.GetUser(MethodsPtr, userId, GCHandle.ToIntPtr(wrapped), GetUserCallbackImpl);
+ }
+
+ public PremiumType GetCurrentUserPremiumType()
+ {
+ var ret = new PremiumType();
+ var res = Methods.GetCurrentUserPremiumType(MethodsPtr, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public bool CurrentUserHasFlag(UserFlag flag)
+ {
+ var ret = new bool();
+ var res = Methods.CurrentUserHasFlag(MethodsPtr, flag, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnCurrentUserUpdateImpl(IntPtr ptr)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.UserManagerInstance.OnCurrentUserUpdate != null)
+ {
+ d.UserManagerInstance.OnCurrentUserUpdate.Invoke();
+ }
+ }
+ }
+
+ public partial class ImageManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FetchCallback(IntPtr ptr, Result result, ImageHandle handleResult);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FetchMethod(IntPtr methodsPtr, ImageHandle handle, bool refresh, IntPtr callbackData, FetchCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetDimensionsMethod(IntPtr methodsPtr, ImageHandle handle, ref ImageDimensions dimensions);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetDataMethod(IntPtr methodsPtr, ImageHandle handle, byte[] data, Int32 dataLen);
+
+ internal FetchMethod Fetch;
+
+ internal GetDimensionsMethod GetDimensions;
+
+ internal GetDataMethod GetData;
+ }
+
+ public delegate void FetchHandler(Result result, ImageHandle handleResult);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ internal ImageManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ [MonoPInvokeCallback]
+ private static void FetchCallbackImpl(IntPtr ptr, Result result, ImageHandle handleResult)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ FetchHandler callback = (FetchHandler)h.Target;
+ h.Free();
+ callback(result, handleResult);
+ }
+
+ public void Fetch(ImageHandle handle, bool refresh, FetchHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.Fetch(MethodsPtr, handle, refresh, GCHandle.ToIntPtr(wrapped), FetchCallbackImpl);
+ }
+
+ public ImageDimensions GetDimensions(ImageHandle handle)
+ {
+ var ret = new ImageDimensions();
+ var res = Methods.GetDimensions(MethodsPtr, handle, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public void GetData(ImageHandle handle, byte[] data)
+ {
+ var res = Methods.GetData(MethodsPtr, handle, data, data.Length);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+ }
+
+ public partial class ActivityManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ActivityJoinHandler(IntPtr ptr, [MarshalAs(UnmanagedType.LPStr)]string secret);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ActivitySpectateHandler(IntPtr ptr, [MarshalAs(UnmanagedType.LPStr)]string secret);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ActivityJoinRequestHandler(IntPtr ptr, ref User user);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ActivityInviteHandler(IntPtr ptr, ActivityActionType type, ref User user, ref Activity activity);
+
+ internal ActivityJoinHandler OnActivityJoin;
+
+ internal ActivitySpectateHandler OnActivitySpectate;
+
+ internal ActivityJoinRequestHandler OnActivityJoinRequest;
+
+ internal ActivityInviteHandler OnActivityInvite;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result RegisterCommandMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string command);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result RegisterSteamMethod(IntPtr methodsPtr, UInt32 steamId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void UpdateActivityCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void UpdateActivityMethod(IntPtr methodsPtr, ref Activity activity, IntPtr callbackData, UpdateActivityCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ClearActivityCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ClearActivityMethod(IntPtr methodsPtr, IntPtr callbackData, ClearActivityCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SendRequestReplyCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SendRequestReplyMethod(IntPtr methodsPtr, Int64 userId, ActivityJoinRequestReply reply, IntPtr callbackData, SendRequestReplyCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SendInviteCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SendInviteMethod(IntPtr methodsPtr, Int64 userId, ActivityActionType type, [MarshalAs(UnmanagedType.LPStr)]string content, IntPtr callbackData, SendInviteCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void AcceptInviteCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void AcceptInviteMethod(IntPtr methodsPtr, Int64 userId, IntPtr callbackData, AcceptInviteCallback callback);
+
+ internal RegisterCommandMethod RegisterCommand;
+
+ internal RegisterSteamMethod RegisterSteam;
+
+ internal UpdateActivityMethod UpdateActivity;
+
+ internal ClearActivityMethod ClearActivity;
+
+ internal SendRequestReplyMethod SendRequestReply;
+
+ internal SendInviteMethod SendInvite;
+
+ internal AcceptInviteMethod AcceptInvite;
+ }
+
+ public delegate void UpdateActivityHandler(Result result);
+
+ public delegate void ClearActivityHandler(Result result);
+
+ public delegate void SendRequestReplyHandler(Result result);
+
+ public delegate void SendInviteHandler(Result result);
+
+ public delegate void AcceptInviteHandler(Result result);
+
+ public delegate void ActivityJoinHandler(string secret);
+
+ public delegate void ActivitySpectateHandler(string secret);
+
+ public delegate void ActivityJoinRequestHandler(ref User user);
+
+ public delegate void ActivityInviteHandler(ActivityActionType type, ref User user, ref Activity activity);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event ActivityJoinHandler OnActivityJoin;
+
+ public event ActivitySpectateHandler OnActivitySpectate;
+
+ public event ActivityJoinRequestHandler OnActivityJoinRequest;
+
+ public event ActivityInviteHandler OnActivityInvite;
+
+ internal ActivityManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnActivityJoin = OnActivityJoinImpl;
+ events.OnActivitySpectate = OnActivitySpectateImpl;
+ events.OnActivityJoinRequest = OnActivityJoinRequestImpl;
+ events.OnActivityInvite = OnActivityInviteImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ public void RegisterCommand(string command)
+ {
+ var res = Methods.RegisterCommand(MethodsPtr, command);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public void RegisterSteam(UInt32 steamId)
+ {
+ var res = Methods.RegisterSteam(MethodsPtr, steamId);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void UpdateActivityCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ UpdateActivityHandler callback = (UpdateActivityHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void UpdateActivity(Activity activity, UpdateActivityHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.UpdateActivity(MethodsPtr, ref activity, GCHandle.ToIntPtr(wrapped), UpdateActivityCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void ClearActivityCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ ClearActivityHandler callback = (ClearActivityHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void ClearActivity(ClearActivityHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.ClearActivity(MethodsPtr, GCHandle.ToIntPtr(wrapped), ClearActivityCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void SendRequestReplyCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ SendRequestReplyHandler callback = (SendRequestReplyHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void SendRequestReply(Int64 userId, ActivityJoinRequestReply reply, SendRequestReplyHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.SendRequestReply(MethodsPtr, userId, reply, GCHandle.ToIntPtr(wrapped), SendRequestReplyCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void SendInviteCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ SendInviteHandler callback = (SendInviteHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void SendInvite(Int64 userId, ActivityActionType type, string content, SendInviteHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.SendInvite(MethodsPtr, userId, type, content, GCHandle.ToIntPtr(wrapped), SendInviteCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void AcceptInviteCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ AcceptInviteHandler callback = (AcceptInviteHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void AcceptInvite(Int64 userId, AcceptInviteHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.AcceptInvite(MethodsPtr, userId, GCHandle.ToIntPtr(wrapped), AcceptInviteCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnActivityJoinImpl(IntPtr ptr, string secret)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.ActivityManagerInstance.OnActivityJoin != null)
+ {
+ d.ActivityManagerInstance.OnActivityJoin.Invoke(secret);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnActivitySpectateImpl(IntPtr ptr, string secret)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.ActivityManagerInstance.OnActivitySpectate != null)
+ {
+ d.ActivityManagerInstance.OnActivitySpectate.Invoke(secret);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnActivityJoinRequestImpl(IntPtr ptr, ref User user)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.ActivityManagerInstance.OnActivityJoinRequest != null)
+ {
+ d.ActivityManagerInstance.OnActivityJoinRequest.Invoke(ref user);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnActivityInviteImpl(IntPtr ptr, ActivityActionType type, ref User user, ref Activity activity)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.ActivityManagerInstance.OnActivityInvite != null)
+ {
+ d.ActivityManagerInstance.OnActivityInvite.Invoke(type, ref user, ref activity);
+ }
+ }
+ }
+
+ public partial class RelationshipManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void RefreshHandler(IntPtr ptr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void RelationshipUpdateHandler(IntPtr ptr, ref Relationship relationship);
+
+ internal RefreshHandler OnRefresh;
+
+ internal RelationshipUpdateHandler OnRelationshipUpdate;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate bool FilterCallback(IntPtr ptr, ref Relationship relationship);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FilterMethod(IntPtr methodsPtr, IntPtr callbackData, FilterCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result CountMethod(IntPtr methodsPtr, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetMethod(IntPtr methodsPtr, Int64 userId, ref Relationship relationship);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetAtMethod(IntPtr methodsPtr, UInt32 index, ref Relationship relationship);
+
+ internal FilterMethod Filter;
+
+ internal CountMethod Count;
+
+ internal GetMethod Get;
+
+ internal GetAtMethod GetAt;
+ }
+
+ public delegate bool FilterHandler(ref Relationship relationship);
+
+ public delegate void RefreshHandler();
+
+ public delegate void RelationshipUpdateHandler(ref Relationship relationship);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event RefreshHandler OnRefresh;
+
+ public event RelationshipUpdateHandler OnRelationshipUpdate;
+
+ internal RelationshipManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnRefresh = OnRefreshImpl;
+ events.OnRelationshipUpdate = OnRelationshipUpdateImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ [MonoPInvokeCallback]
+ private static bool FilterCallbackImpl(IntPtr ptr, ref Relationship relationship)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ FilterHandler callback = (FilterHandler)h.Target;
+ return callback(ref relationship);
+ }
+
+ public void Filter(FilterHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.Filter(MethodsPtr, GCHandle.ToIntPtr(wrapped), FilterCallbackImpl);
+ wrapped.Free();
+ }
+
+ public Int32 Count()
+ {
+ var ret = new Int32();
+ var res = Methods.Count(MethodsPtr, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public Relationship Get(Int64 userId)
+ {
+ var ret = new Relationship();
+ var res = Methods.Get(MethodsPtr, userId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public Relationship GetAt(UInt32 index)
+ {
+ var ret = new Relationship();
+ var res = Methods.GetAt(MethodsPtr, index, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnRefreshImpl(IntPtr ptr)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.RelationshipManagerInstance.OnRefresh != null)
+ {
+ d.RelationshipManagerInstance.OnRefresh.Invoke();
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnRelationshipUpdateImpl(IntPtr ptr, ref Relationship relationship)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.RelationshipManagerInstance.OnRelationshipUpdate != null)
+ {
+ d.RelationshipManagerInstance.OnRelationshipUpdate.Invoke(ref relationship);
+ }
+ }
+ }
+
+ public partial class LobbyManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void LobbyUpdateHandler(IntPtr ptr, Int64 lobbyId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void LobbyDeleteHandler(IntPtr ptr, Int64 lobbyId, UInt32 reason);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void MemberConnectHandler(IntPtr ptr, Int64 lobbyId, Int64 userId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void MemberUpdateHandler(IntPtr ptr, Int64 lobbyId, Int64 userId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void MemberDisconnectHandler(IntPtr ptr, Int64 lobbyId, Int64 userId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void LobbyMessageHandler(IntPtr ptr, Int64 lobbyId, Int64 userId, IntPtr dataPtr, Int32 dataLen);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SpeakingHandler(IntPtr ptr, Int64 lobbyId, Int64 userId, bool speaking);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void NetworkMessageHandler(IntPtr ptr, Int64 lobbyId, Int64 userId, byte channelId, IntPtr dataPtr, Int32 dataLen);
+
+ internal LobbyUpdateHandler OnLobbyUpdate;
+
+ internal LobbyDeleteHandler OnLobbyDelete;
+
+ internal MemberConnectHandler OnMemberConnect;
+
+ internal MemberUpdateHandler OnMemberUpdate;
+
+ internal MemberDisconnectHandler OnMemberDisconnect;
+
+ internal LobbyMessageHandler OnLobbyMessage;
+
+ internal SpeakingHandler OnSpeaking;
+
+ internal NetworkMessageHandler OnNetworkMessage;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetLobbyCreateTransactionMethod(IntPtr methodsPtr, ref IntPtr transaction);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetLobbyUpdateTransactionMethod(IntPtr methodsPtr, Int64 lobbyId, ref IntPtr transaction);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetMemberUpdateTransactionMethod(IntPtr methodsPtr, Int64 lobbyId, Int64 userId, ref IntPtr transaction);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void CreateLobbyCallback(IntPtr ptr, Result result, ref Lobby lobby);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void CreateLobbyMethod(IntPtr methodsPtr, IntPtr transaction, IntPtr callbackData, CreateLobbyCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void UpdateLobbyCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void UpdateLobbyMethod(IntPtr methodsPtr, Int64 lobbyId, IntPtr transaction, IntPtr callbackData, UpdateLobbyCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void DeleteLobbyCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void DeleteLobbyMethod(IntPtr methodsPtr, Int64 lobbyId, IntPtr callbackData, DeleteLobbyCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ConnectLobbyCallback(IntPtr ptr, Result result, ref Lobby lobby);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ConnectLobbyMethod(IntPtr methodsPtr, Int64 lobbyId, [MarshalAs(UnmanagedType.LPStr)]string secret, IntPtr callbackData, ConnectLobbyCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ConnectLobbyWithActivitySecretCallback(IntPtr ptr, Result result, ref Lobby lobby);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ConnectLobbyWithActivitySecretMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string activitySecret, IntPtr callbackData, ConnectLobbyWithActivitySecretCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void DisconnectLobbyCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void DisconnectLobbyMethod(IntPtr methodsPtr, Int64 lobbyId, IntPtr callbackData, DisconnectLobbyCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetLobbyMethod(IntPtr methodsPtr, Int64 lobbyId, ref Lobby lobby);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetLobbyActivitySecretMethod(IntPtr methodsPtr, Int64 lobbyId, StringBuilder secret);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetLobbyMetadataValueMethod(IntPtr methodsPtr, Int64 lobbyId, [MarshalAs(UnmanagedType.LPStr)]string key, StringBuilder value);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetLobbyMetadataKeyMethod(IntPtr methodsPtr, Int64 lobbyId, Int32 index, StringBuilder key);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result LobbyMetadataCountMethod(IntPtr methodsPtr, Int64 lobbyId, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result MemberCountMethod(IntPtr methodsPtr, Int64 lobbyId, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetMemberUserIdMethod(IntPtr methodsPtr, Int64 lobbyId, Int32 index, ref Int64 userId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetMemberUserMethod(IntPtr methodsPtr, Int64 lobbyId, Int64 userId, ref User user);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetMemberMetadataValueMethod(IntPtr methodsPtr, Int64 lobbyId, Int64 userId, [MarshalAs(UnmanagedType.LPStr)]string key, StringBuilder value);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetMemberMetadataKeyMethod(IntPtr methodsPtr, Int64 lobbyId, Int64 userId, Int32 index, StringBuilder key);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result MemberMetadataCountMethod(IntPtr methodsPtr, Int64 lobbyId, Int64 userId, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void UpdateMemberCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void UpdateMemberMethod(IntPtr methodsPtr, Int64 lobbyId, Int64 userId, IntPtr transaction, IntPtr callbackData, UpdateMemberCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SendLobbyMessageCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SendLobbyMessageMethod(IntPtr methodsPtr, Int64 lobbyId, byte[] data, Int32 dataLen, IntPtr callbackData, SendLobbyMessageCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetSearchQueryMethod(IntPtr methodsPtr, ref IntPtr query);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SearchCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SearchMethod(IntPtr methodsPtr, IntPtr query, IntPtr callbackData, SearchCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void LobbyCountMethod(IntPtr methodsPtr, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetLobbyIdMethod(IntPtr methodsPtr, Int32 index, ref Int64 lobbyId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ConnectVoiceCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ConnectVoiceMethod(IntPtr methodsPtr, Int64 lobbyId, IntPtr callbackData, ConnectVoiceCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void DisconnectVoiceCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void DisconnectVoiceMethod(IntPtr methodsPtr, Int64 lobbyId, IntPtr callbackData, DisconnectVoiceCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result ConnectNetworkMethod(IntPtr methodsPtr, Int64 lobbyId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result DisconnectNetworkMethod(IntPtr methodsPtr, Int64 lobbyId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result FlushNetworkMethod(IntPtr methodsPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result OpenNetworkChannelMethod(IntPtr methodsPtr, Int64 lobbyId, byte channelId, bool reliable);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SendNetworkMessageMethod(IntPtr methodsPtr, Int64 lobbyId, Int64 userId, byte channelId, byte[] data, Int32 dataLen);
+
+ internal GetLobbyCreateTransactionMethod GetLobbyCreateTransaction;
+
+ internal GetLobbyUpdateTransactionMethod GetLobbyUpdateTransaction;
+
+ internal GetMemberUpdateTransactionMethod GetMemberUpdateTransaction;
+
+ internal CreateLobbyMethod CreateLobby;
+
+ internal UpdateLobbyMethod UpdateLobby;
+
+ internal DeleteLobbyMethod DeleteLobby;
+
+ internal ConnectLobbyMethod ConnectLobby;
+
+ internal ConnectLobbyWithActivitySecretMethod ConnectLobbyWithActivitySecret;
+
+ internal DisconnectLobbyMethod DisconnectLobby;
+
+ internal GetLobbyMethod GetLobby;
+
+ internal GetLobbyActivitySecretMethod GetLobbyActivitySecret;
+
+ internal GetLobbyMetadataValueMethod GetLobbyMetadataValue;
+
+ internal GetLobbyMetadataKeyMethod GetLobbyMetadataKey;
+
+ internal LobbyMetadataCountMethod LobbyMetadataCount;
+
+ internal MemberCountMethod MemberCount;
+
+ internal GetMemberUserIdMethod GetMemberUserId;
+
+ internal GetMemberUserMethod GetMemberUser;
+
+ internal GetMemberMetadataValueMethod GetMemberMetadataValue;
+
+ internal GetMemberMetadataKeyMethod GetMemberMetadataKey;
+
+ internal MemberMetadataCountMethod MemberMetadataCount;
+
+ internal UpdateMemberMethod UpdateMember;
+
+ internal SendLobbyMessageMethod SendLobbyMessage;
+
+ internal GetSearchQueryMethod GetSearchQuery;
+
+ internal SearchMethod Search;
+
+ internal LobbyCountMethod LobbyCount;
+
+ internal GetLobbyIdMethod GetLobbyId;
+
+ internal ConnectVoiceMethod ConnectVoice;
+
+ internal DisconnectVoiceMethod DisconnectVoice;
+
+ internal ConnectNetworkMethod ConnectNetwork;
+
+ internal DisconnectNetworkMethod DisconnectNetwork;
+
+ internal FlushNetworkMethod FlushNetwork;
+
+ internal OpenNetworkChannelMethod OpenNetworkChannel;
+
+ internal SendNetworkMessageMethod SendNetworkMessage;
+ }
+
+ public delegate void CreateLobbyHandler(Result result, ref Lobby lobby);
+
+ public delegate void UpdateLobbyHandler(Result result);
+
+ public delegate void DeleteLobbyHandler(Result result);
+
+ public delegate void ConnectLobbyHandler(Result result, ref Lobby lobby);
+
+ public delegate void ConnectLobbyWithActivitySecretHandler(Result result, ref Lobby lobby);
+
+ public delegate void DisconnectLobbyHandler(Result result);
+
+ public delegate void UpdateMemberHandler(Result result);
+
+ public delegate void SendLobbyMessageHandler(Result result);
+
+ public delegate void SearchHandler(Result result);
+
+ public delegate void ConnectVoiceHandler(Result result);
+
+ public delegate void DisconnectVoiceHandler(Result result);
+
+ public delegate void LobbyUpdateHandler(Int64 lobbyId);
+
+ public delegate void LobbyDeleteHandler(Int64 lobbyId, UInt32 reason);
+
+ public delegate void MemberConnectHandler(Int64 lobbyId, Int64 userId);
+
+ public delegate void MemberUpdateHandler(Int64 lobbyId, Int64 userId);
+
+ public delegate void MemberDisconnectHandler(Int64 lobbyId, Int64 userId);
+
+ public delegate void LobbyMessageHandler(Int64 lobbyId, Int64 userId, byte[] data);
+
+ public delegate void SpeakingHandler(Int64 lobbyId, Int64 userId, bool speaking);
+
+ public delegate void NetworkMessageHandler(Int64 lobbyId, Int64 userId, byte channelId, byte[] data);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event LobbyUpdateHandler OnLobbyUpdate;
+
+ public event LobbyDeleteHandler OnLobbyDelete;
+
+ public event MemberConnectHandler OnMemberConnect;
+
+ public event MemberUpdateHandler OnMemberUpdate;
+
+ public event MemberDisconnectHandler OnMemberDisconnect;
+
+ public event LobbyMessageHandler OnLobbyMessage;
+
+ public event SpeakingHandler OnSpeaking;
+
+ public event NetworkMessageHandler OnNetworkMessage;
+
+ internal LobbyManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnLobbyUpdate = OnLobbyUpdateImpl;
+ events.OnLobbyDelete = OnLobbyDeleteImpl;
+ events.OnMemberConnect = OnMemberConnectImpl;
+ events.OnMemberUpdate = OnMemberUpdateImpl;
+ events.OnMemberDisconnect = OnMemberDisconnectImpl;
+ events.OnLobbyMessage = OnLobbyMessageImpl;
+ events.OnSpeaking = OnSpeakingImpl;
+ events.OnNetworkMessage = OnNetworkMessageImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ public LobbyTransaction GetLobbyCreateTransaction()
+ {
+ var ret = new LobbyTransaction();
+ var res = Methods.GetLobbyCreateTransaction(MethodsPtr, ref ret.MethodsPtr);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public LobbyTransaction GetLobbyUpdateTransaction(Int64 lobbyId)
+ {
+ var ret = new LobbyTransaction();
+ var res = Methods.GetLobbyUpdateTransaction(MethodsPtr, lobbyId, ref ret.MethodsPtr);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public LobbyMemberTransaction GetMemberUpdateTransaction(Int64 lobbyId, Int64 userId)
+ {
+ var ret = new LobbyMemberTransaction();
+ var res = Methods.GetMemberUpdateTransaction(MethodsPtr, lobbyId, userId, ref ret.MethodsPtr);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void CreateLobbyCallbackImpl(IntPtr ptr, Result result, ref Lobby lobby)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ CreateLobbyHandler callback = (CreateLobbyHandler)h.Target;
+ h.Free();
+ callback(result, ref lobby);
+ }
+
+ public void CreateLobby(LobbyTransaction transaction, CreateLobbyHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.CreateLobby(MethodsPtr, transaction.MethodsPtr, GCHandle.ToIntPtr(wrapped), CreateLobbyCallbackImpl);
+ transaction.MethodsPtr = IntPtr.Zero;
+ }
+
+ [MonoPInvokeCallback]
+ private static void UpdateLobbyCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ UpdateLobbyHandler callback = (UpdateLobbyHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void UpdateLobby(Int64 lobbyId, LobbyTransaction transaction, UpdateLobbyHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.UpdateLobby(MethodsPtr, lobbyId, transaction.MethodsPtr, GCHandle.ToIntPtr(wrapped), UpdateLobbyCallbackImpl);
+ transaction.MethodsPtr = IntPtr.Zero;
+ }
+
+ [MonoPInvokeCallback]
+ private static void DeleteLobbyCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ DeleteLobbyHandler callback = (DeleteLobbyHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void DeleteLobby(Int64 lobbyId, DeleteLobbyHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.DeleteLobby(MethodsPtr, lobbyId, GCHandle.ToIntPtr(wrapped), DeleteLobbyCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void ConnectLobbyCallbackImpl(IntPtr ptr, Result result, ref Lobby lobby)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ ConnectLobbyHandler callback = (ConnectLobbyHandler)h.Target;
+ h.Free();
+ callback(result, ref lobby);
+ }
+
+ public void ConnectLobby(Int64 lobbyId, string secret, ConnectLobbyHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.ConnectLobby(MethodsPtr, lobbyId, secret, GCHandle.ToIntPtr(wrapped), ConnectLobbyCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void ConnectLobbyWithActivitySecretCallbackImpl(IntPtr ptr, Result result, ref Lobby lobby)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ ConnectLobbyWithActivitySecretHandler callback = (ConnectLobbyWithActivitySecretHandler)h.Target;
+ h.Free();
+ callback(result, ref lobby);
+ }
+
+ public void ConnectLobbyWithActivitySecret(string activitySecret, ConnectLobbyWithActivitySecretHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.ConnectLobbyWithActivitySecret(MethodsPtr, activitySecret, GCHandle.ToIntPtr(wrapped), ConnectLobbyWithActivitySecretCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void DisconnectLobbyCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ DisconnectLobbyHandler callback = (DisconnectLobbyHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void DisconnectLobby(Int64 lobbyId, DisconnectLobbyHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.DisconnectLobby(MethodsPtr, lobbyId, GCHandle.ToIntPtr(wrapped), DisconnectLobbyCallbackImpl);
+ }
+
+ public Lobby GetLobby(Int64 lobbyId)
+ {
+ var ret = new Lobby();
+ var res = Methods.GetLobby(MethodsPtr, lobbyId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public string GetLobbyActivitySecret(Int64 lobbyId)
+ {
+ var ret = new StringBuilder(128);
+ var res = Methods.GetLobbyActivitySecret(MethodsPtr, lobbyId, ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret.ToString();
+ }
+
+ public string GetLobbyMetadataValue(Int64 lobbyId, string key)
+ {
+ var ret = new StringBuilder(4096);
+ var res = Methods.GetLobbyMetadataValue(MethodsPtr, lobbyId, key, ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret.ToString();
+ }
+
+ public string GetLobbyMetadataKey(Int64 lobbyId, Int32 index)
+ {
+ var ret = new StringBuilder(256);
+ var res = Methods.GetLobbyMetadataKey(MethodsPtr, lobbyId, index, ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret.ToString();
+ }
+
+ public Int32 LobbyMetadataCount(Int64 lobbyId)
+ {
+ var ret = new Int32();
+ var res = Methods.LobbyMetadataCount(MethodsPtr, lobbyId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public Int32 MemberCount(Int64 lobbyId)
+ {
+ var ret = new Int32();
+ var res = Methods.MemberCount(MethodsPtr, lobbyId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public Int64 GetMemberUserId(Int64 lobbyId, Int32 index)
+ {
+ var ret = new Int64();
+ var res = Methods.GetMemberUserId(MethodsPtr, lobbyId, index, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public User GetMemberUser(Int64 lobbyId, Int64 userId)
+ {
+ var ret = new User();
+ var res = Methods.GetMemberUser(MethodsPtr, lobbyId, userId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public string GetMemberMetadataValue(Int64 lobbyId, Int64 userId, string key)
+ {
+ var ret = new StringBuilder(4096);
+ var res = Methods.GetMemberMetadataValue(MethodsPtr, lobbyId, userId, key, ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret.ToString();
+ }
+
+ public string GetMemberMetadataKey(Int64 lobbyId, Int64 userId, Int32 index)
+ {
+ var ret = new StringBuilder(256);
+ var res = Methods.GetMemberMetadataKey(MethodsPtr, lobbyId, userId, index, ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret.ToString();
+ }
+
+ public Int32 MemberMetadataCount(Int64 lobbyId, Int64 userId)
+ {
+ var ret = new Int32();
+ var res = Methods.MemberMetadataCount(MethodsPtr, lobbyId, userId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void UpdateMemberCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ UpdateMemberHandler callback = (UpdateMemberHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void UpdateMember(Int64 lobbyId, Int64 userId, LobbyMemberTransaction transaction, UpdateMemberHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.UpdateMember(MethodsPtr, lobbyId, userId, transaction.MethodsPtr, GCHandle.ToIntPtr(wrapped), UpdateMemberCallbackImpl);
+ transaction.MethodsPtr = IntPtr.Zero;
+ }
+
+ [MonoPInvokeCallback]
+ private static void SendLobbyMessageCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ SendLobbyMessageHandler callback = (SendLobbyMessageHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void SendLobbyMessage(Int64 lobbyId, byte[] data, SendLobbyMessageHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.SendLobbyMessage(MethodsPtr, lobbyId, data, data.Length, GCHandle.ToIntPtr(wrapped), SendLobbyMessageCallbackImpl);
+ }
+
+ public LobbySearchQuery GetSearchQuery()
+ {
+ var ret = new LobbySearchQuery();
+ var res = Methods.GetSearchQuery(MethodsPtr, ref ret.MethodsPtr);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void SearchCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ SearchHandler callback = (SearchHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void Search(LobbySearchQuery query, SearchHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.Search(MethodsPtr, query.MethodsPtr, GCHandle.ToIntPtr(wrapped), SearchCallbackImpl);
+ query.MethodsPtr = IntPtr.Zero;
+ }
+
+ public Int32 LobbyCount()
+ {
+ var ret = new Int32();
+ Methods.LobbyCount(MethodsPtr, ref ret);
+ return ret;
+ }
+
+ public Int64 GetLobbyId(Int32 index)
+ {
+ var ret = new Int64();
+ var res = Methods.GetLobbyId(MethodsPtr, index, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void ConnectVoiceCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ ConnectVoiceHandler callback = (ConnectVoiceHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void ConnectVoice(Int64 lobbyId, ConnectVoiceHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.ConnectVoice(MethodsPtr, lobbyId, GCHandle.ToIntPtr(wrapped), ConnectVoiceCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void DisconnectVoiceCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ DisconnectVoiceHandler callback = (DisconnectVoiceHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void DisconnectVoice(Int64 lobbyId, DisconnectVoiceHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.DisconnectVoice(MethodsPtr, lobbyId, GCHandle.ToIntPtr(wrapped), DisconnectVoiceCallbackImpl);
+ }
+
+ public void ConnectNetwork(Int64 lobbyId)
+ {
+ var res = Methods.ConnectNetwork(MethodsPtr, lobbyId);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public void DisconnectNetwork(Int64 lobbyId)
+ {
+ var res = Methods.DisconnectNetwork(MethodsPtr, lobbyId);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public void FlushNetwork()
+ {
+ var res = Methods.FlushNetwork(MethodsPtr);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public void OpenNetworkChannel(Int64 lobbyId, byte channelId, bool reliable)
+ {
+ var res = Methods.OpenNetworkChannel(MethodsPtr, lobbyId, channelId, reliable);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public void SendNetworkMessage(Int64 lobbyId, Int64 userId, byte channelId, byte[] data)
+ {
+ var res = Methods.SendNetworkMessage(MethodsPtr, lobbyId, userId, channelId, data, data.Length);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnLobbyUpdateImpl(IntPtr ptr, Int64 lobbyId)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.LobbyManagerInstance.OnLobbyUpdate != null)
+ {
+ d.LobbyManagerInstance.OnLobbyUpdate.Invoke(lobbyId);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnLobbyDeleteImpl(IntPtr ptr, Int64 lobbyId, UInt32 reason)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.LobbyManagerInstance.OnLobbyDelete != null)
+ {
+ d.LobbyManagerInstance.OnLobbyDelete.Invoke(lobbyId, reason);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnMemberConnectImpl(IntPtr ptr, Int64 lobbyId, Int64 userId)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.LobbyManagerInstance.OnMemberConnect != null)
+ {
+ d.LobbyManagerInstance.OnMemberConnect.Invoke(lobbyId, userId);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnMemberUpdateImpl(IntPtr ptr, Int64 lobbyId, Int64 userId)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.LobbyManagerInstance.OnMemberUpdate != null)
+ {
+ d.LobbyManagerInstance.OnMemberUpdate.Invoke(lobbyId, userId);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnMemberDisconnectImpl(IntPtr ptr, Int64 lobbyId, Int64 userId)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.LobbyManagerInstance.OnMemberDisconnect != null)
+ {
+ d.LobbyManagerInstance.OnMemberDisconnect.Invoke(lobbyId, userId);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnLobbyMessageImpl(IntPtr ptr, Int64 lobbyId, Int64 userId, IntPtr dataPtr, Int32 dataLen)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.LobbyManagerInstance.OnLobbyMessage != null)
+ {
+ byte[] data = new byte[dataLen];
+ Marshal.Copy(dataPtr, data, 0, (int)dataLen);
+ d.LobbyManagerInstance.OnLobbyMessage.Invoke(lobbyId, userId, data);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnSpeakingImpl(IntPtr ptr, Int64 lobbyId, Int64 userId, bool speaking)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.LobbyManagerInstance.OnSpeaking != null)
+ {
+ d.LobbyManagerInstance.OnSpeaking.Invoke(lobbyId, userId, speaking);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnNetworkMessageImpl(IntPtr ptr, Int64 lobbyId, Int64 userId, byte channelId, IntPtr dataPtr, Int32 dataLen)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.LobbyManagerInstance.OnNetworkMessage != null)
+ {
+ byte[] data = new byte[dataLen];
+ Marshal.Copy(dataPtr, data, 0, (int)dataLen);
+ d.LobbyManagerInstance.OnNetworkMessage.Invoke(lobbyId, userId, channelId, data);
+ }
+ }
+ }
+
+ public partial class NetworkManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void MessageHandler(IntPtr ptr, UInt64 peerId, byte channelId, IntPtr dataPtr, Int32 dataLen);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void RouteUpdateHandler(IntPtr ptr, [MarshalAs(UnmanagedType.LPStr)]string routeData);
+
+ internal MessageHandler OnMessage;
+
+ internal RouteUpdateHandler OnRouteUpdate;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void GetPeerIdMethod(IntPtr methodsPtr, ref UInt64 peerId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result FlushMethod(IntPtr methodsPtr);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result OpenPeerMethod(IntPtr methodsPtr, UInt64 peerId, [MarshalAs(UnmanagedType.LPStr)]string routeData);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result UpdatePeerMethod(IntPtr methodsPtr, UInt64 peerId, [MarshalAs(UnmanagedType.LPStr)]string routeData);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result ClosePeerMethod(IntPtr methodsPtr, UInt64 peerId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result OpenChannelMethod(IntPtr methodsPtr, UInt64 peerId, byte channelId, bool reliable);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result CloseChannelMethod(IntPtr methodsPtr, UInt64 peerId, byte channelId);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SendMessageMethod(IntPtr methodsPtr, UInt64 peerId, byte channelId, byte[] data, Int32 dataLen);
+
+ internal GetPeerIdMethod GetPeerId;
+
+ internal FlushMethod Flush;
+
+ internal OpenPeerMethod OpenPeer;
+
+ internal UpdatePeerMethod UpdatePeer;
+
+ internal ClosePeerMethod ClosePeer;
+
+ internal OpenChannelMethod OpenChannel;
+
+ internal CloseChannelMethod CloseChannel;
+
+ internal SendMessageMethod SendMessage;
+ }
+
+ public delegate void MessageHandler(UInt64 peerId, byte channelId, byte[] data);
+
+ public delegate void RouteUpdateHandler(string routeData);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event MessageHandler OnMessage;
+
+ public event RouteUpdateHandler OnRouteUpdate;
+
+ internal NetworkManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnMessage = OnMessageImpl;
+ events.OnRouteUpdate = OnRouteUpdateImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ ///
+ /// Get the local peer ID for this process.
+ ///
+ public UInt64 GetPeerId()
+ {
+ var ret = new UInt64();
+ Methods.GetPeerId(MethodsPtr, ref ret);
+ return ret;
+ }
+
+ ///
+ /// Send pending network messages.
+ ///
+ public void Flush()
+ {
+ var res = Methods.Flush(MethodsPtr);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ ///
+ /// Open a connection to a remote peer.
+ ///
+ public void OpenPeer(UInt64 peerId, string routeData)
+ {
+ var res = Methods.OpenPeer(MethodsPtr, peerId, routeData);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ ///
+ /// Update the route data for a connected peer.
+ ///
+ public void UpdatePeer(UInt64 peerId, string routeData)
+ {
+ var res = Methods.UpdatePeer(MethodsPtr, peerId, routeData);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ ///
+ /// Close the connection to a remote peer.
+ ///
+ public void ClosePeer(UInt64 peerId)
+ {
+ var res = Methods.ClosePeer(MethodsPtr, peerId);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ ///
+ /// Open a message channel to a connected peer.
+ ///
+ public void OpenChannel(UInt64 peerId, byte channelId, bool reliable)
+ {
+ var res = Methods.OpenChannel(MethodsPtr, peerId, channelId, reliable);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ ///
+ /// Close a message channel to a connected peer.
+ ///
+ public void CloseChannel(UInt64 peerId, byte channelId)
+ {
+ var res = Methods.CloseChannel(MethodsPtr, peerId, channelId);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ ///
+ /// Send a message to a connected peer over an opened message channel.
+ ///
+ public void SendMessage(UInt64 peerId, byte channelId, byte[] data)
+ {
+ var res = Methods.SendMessage(MethodsPtr, peerId, channelId, data, data.Length);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnMessageImpl(IntPtr ptr, UInt64 peerId, byte channelId, IntPtr dataPtr, Int32 dataLen)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.NetworkManagerInstance.OnMessage != null)
+ {
+ byte[] data = new byte[dataLen];
+ Marshal.Copy(dataPtr, data, 0, (int)dataLen);
+ d.NetworkManagerInstance.OnMessage.Invoke(peerId, channelId, data);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnRouteUpdateImpl(IntPtr ptr, string routeData)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.NetworkManagerInstance.OnRouteUpdate != null)
+ {
+ d.NetworkManagerInstance.OnRouteUpdate.Invoke(routeData);
+ }
+ }
+ }
+
+ public partial class OverlayManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ToggleHandler(IntPtr ptr, bool locked);
+
+ internal ToggleHandler OnToggle;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void IsEnabledMethod(IntPtr methodsPtr, ref bool enabled);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void IsLockedMethod(IntPtr methodsPtr, ref bool locked);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SetLockedCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SetLockedMethod(IntPtr methodsPtr, bool locked, IntPtr callbackData, SetLockedCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void OpenActivityInviteCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void OpenActivityInviteMethod(IntPtr methodsPtr, ActivityActionType type, IntPtr callbackData, OpenActivityInviteCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void OpenGuildInviteCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void OpenGuildInviteMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string code, IntPtr callbackData, OpenGuildInviteCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void OpenVoiceSettingsCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void OpenVoiceSettingsMethod(IntPtr methodsPtr, IntPtr callbackData, OpenVoiceSettingsCallback callback);
+
+ internal IsEnabledMethod IsEnabled;
+
+ internal IsLockedMethod IsLocked;
+
+ internal SetLockedMethod SetLocked;
+
+ internal OpenActivityInviteMethod OpenActivityInvite;
+
+ internal OpenGuildInviteMethod OpenGuildInvite;
+
+ internal OpenVoiceSettingsMethod OpenVoiceSettings;
+ }
+
+ public delegate void SetLockedHandler(Result result);
+
+ public delegate void OpenActivityInviteHandler(Result result);
+
+ public delegate void OpenGuildInviteHandler(Result result);
+
+ public delegate void OpenVoiceSettingsHandler(Result result);
+
+ public delegate void ToggleHandler(bool locked);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event ToggleHandler OnToggle;
+
+ internal OverlayManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnToggle = OnToggleImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ public bool IsEnabled()
+ {
+ var ret = new bool();
+ Methods.IsEnabled(MethodsPtr, ref ret);
+ return ret;
+ }
+
+ public bool IsLocked()
+ {
+ var ret = new bool();
+ Methods.IsLocked(MethodsPtr, ref ret);
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void SetLockedCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ SetLockedHandler callback = (SetLockedHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void SetLocked(bool locked, SetLockedHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.SetLocked(MethodsPtr, locked, GCHandle.ToIntPtr(wrapped), SetLockedCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void OpenActivityInviteCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ OpenActivityInviteHandler callback = (OpenActivityInviteHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void OpenActivityInvite(ActivityActionType type, OpenActivityInviteHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.OpenActivityInvite(MethodsPtr, type, GCHandle.ToIntPtr(wrapped), OpenActivityInviteCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void OpenGuildInviteCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ OpenGuildInviteHandler callback = (OpenGuildInviteHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void OpenGuildInvite(string code, OpenGuildInviteHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.OpenGuildInvite(MethodsPtr, code, GCHandle.ToIntPtr(wrapped), OpenGuildInviteCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void OpenVoiceSettingsCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ OpenVoiceSettingsHandler callback = (OpenVoiceSettingsHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void OpenVoiceSettings(OpenVoiceSettingsHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.OpenVoiceSettings(MethodsPtr, GCHandle.ToIntPtr(wrapped), OpenVoiceSettingsCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnToggleImpl(IntPtr ptr, bool locked)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.OverlayManagerInstance.OnToggle != null)
+ {
+ d.OverlayManagerInstance.OnToggle.Invoke(locked);
+ }
+ }
+ }
+
+ public partial class StorageManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result ReadMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string name, byte[] data, Int32 dataLen, ref UInt32 read);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ReadAsyncCallback(IntPtr ptr, Result result, IntPtr dataPtr, Int32 dataLen);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ReadAsyncMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string name, IntPtr callbackData, ReadAsyncCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ReadAsyncPartialCallback(IntPtr ptr, Result result, IntPtr dataPtr, Int32 dataLen);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void ReadAsyncPartialMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string name, UInt64 offset, UInt64 length, IntPtr callbackData, ReadAsyncPartialCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result WriteMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string name, byte[] data, Int32 dataLen);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void WriteAsyncCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void WriteAsyncMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string name, byte[] data, Int32 dataLen, IntPtr callbackData, WriteAsyncCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result DeleteMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string name);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result ExistsMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string name, ref bool exists);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void CountMethod(IntPtr methodsPtr, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result StatMethod(IntPtr methodsPtr, [MarshalAs(UnmanagedType.LPStr)]string name, ref FileStat stat);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result StatAtMethod(IntPtr methodsPtr, Int32 index, ref FileStat stat);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetPathMethod(IntPtr methodsPtr, StringBuilder path);
+
+ internal ReadMethod Read;
+
+ internal ReadAsyncMethod ReadAsync;
+
+ internal ReadAsyncPartialMethod ReadAsyncPartial;
+
+ internal WriteMethod Write;
+
+ internal WriteAsyncMethod WriteAsync;
+
+ internal DeleteMethod Delete;
+
+ internal ExistsMethod Exists;
+
+ internal CountMethod Count;
+
+ internal StatMethod Stat;
+
+ internal StatAtMethod StatAt;
+
+ internal GetPathMethod GetPath;
+ }
+
+ public delegate void ReadAsyncHandler(Result result, byte[] data);
+
+ public delegate void ReadAsyncPartialHandler(Result result, byte[] data);
+
+ public delegate void WriteAsyncHandler(Result result);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ internal StorageManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ public UInt32 Read(string name, byte[] data)
+ {
+ var ret = new UInt32();
+ var res = Methods.Read(MethodsPtr, name, data, data.Length, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void ReadAsyncCallbackImpl(IntPtr ptr, Result result, IntPtr dataPtr, Int32 dataLen)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ ReadAsyncHandler callback = (ReadAsyncHandler)h.Target;
+ h.Free();
+ byte[] data = new byte[dataLen];
+ Marshal.Copy(dataPtr, data, 0, (int)dataLen);
+ callback(result, data);
+ }
+
+ public void ReadAsync(string name, ReadAsyncHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.ReadAsync(MethodsPtr, name, GCHandle.ToIntPtr(wrapped), ReadAsyncCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void ReadAsyncPartialCallbackImpl(IntPtr ptr, Result result, IntPtr dataPtr, Int32 dataLen)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ ReadAsyncPartialHandler callback = (ReadAsyncPartialHandler)h.Target;
+ h.Free();
+ byte[] data = new byte[dataLen];
+ Marshal.Copy(dataPtr, data, 0, (int)dataLen);
+ callback(result, data);
+ }
+
+ public void ReadAsyncPartial(string name, UInt64 offset, UInt64 length, ReadAsyncPartialHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.ReadAsyncPartial(MethodsPtr, name, offset, length, GCHandle.ToIntPtr(wrapped), ReadAsyncPartialCallbackImpl);
+ }
+
+ public void Write(string name, byte[] data)
+ {
+ var res = Methods.Write(MethodsPtr, name, data, data.Length);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void WriteAsyncCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ WriteAsyncHandler callback = (WriteAsyncHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void WriteAsync(string name, byte[] data, WriteAsyncHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.WriteAsync(MethodsPtr, name, data, data.Length, GCHandle.ToIntPtr(wrapped), WriteAsyncCallbackImpl);
+ }
+
+ public void Delete(string name)
+ {
+ var res = Methods.Delete(MethodsPtr, name);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public bool Exists(string name)
+ {
+ var ret = new bool();
+ var res = Methods.Exists(MethodsPtr, name, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public Int32 Count()
+ {
+ var ret = new Int32();
+ Methods.Count(MethodsPtr, ref ret);
+ return ret;
+ }
+
+ public FileStat Stat(string name)
+ {
+ var ret = new FileStat();
+ var res = Methods.Stat(MethodsPtr, name, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public FileStat StatAt(Int32 index)
+ {
+ var ret = new FileStat();
+ var res = Methods.StatAt(MethodsPtr, index, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public string GetPath()
+ {
+ var ret = new StringBuilder(4096);
+ var res = Methods.GetPath(MethodsPtr, ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret.ToString();
+ }
+ }
+
+ public partial class StoreManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void EntitlementCreateHandler(IntPtr ptr, ref Entitlement entitlement);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void EntitlementDeleteHandler(IntPtr ptr, ref Entitlement entitlement);
+
+ internal EntitlementCreateHandler OnEntitlementCreate;
+
+ internal EntitlementDeleteHandler OnEntitlementDelete;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FetchSkusCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FetchSkusMethod(IntPtr methodsPtr, IntPtr callbackData, FetchSkusCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void CountSkusMethod(IntPtr methodsPtr, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetSkuMethod(IntPtr methodsPtr, Int64 skuId, ref Sku sku);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetSkuAtMethod(IntPtr methodsPtr, Int32 index, ref Sku sku);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FetchEntitlementsCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FetchEntitlementsMethod(IntPtr methodsPtr, IntPtr callbackData, FetchEntitlementsCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void CountEntitlementsMethod(IntPtr methodsPtr, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetEntitlementMethod(IntPtr methodsPtr, Int64 entitlementId, ref Entitlement entitlement);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetEntitlementAtMethod(IntPtr methodsPtr, Int32 index, ref Entitlement entitlement);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result HasSkuEntitlementMethod(IntPtr methodsPtr, Int64 skuId, ref bool hasEntitlement);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void StartPurchaseCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void StartPurchaseMethod(IntPtr methodsPtr, Int64 skuId, IntPtr callbackData, StartPurchaseCallback callback);
+
+ internal FetchSkusMethod FetchSkus;
+
+ internal CountSkusMethod CountSkus;
+
+ internal GetSkuMethod GetSku;
+
+ internal GetSkuAtMethod GetSkuAt;
+
+ internal FetchEntitlementsMethod FetchEntitlements;
+
+ internal CountEntitlementsMethod CountEntitlements;
+
+ internal GetEntitlementMethod GetEntitlement;
+
+ internal GetEntitlementAtMethod GetEntitlementAt;
+
+ internal HasSkuEntitlementMethod HasSkuEntitlement;
+
+ internal StartPurchaseMethod StartPurchase;
+ }
+
+ public delegate void FetchSkusHandler(Result result);
+
+ public delegate void FetchEntitlementsHandler(Result result);
+
+ public delegate void StartPurchaseHandler(Result result);
+
+ public delegate void EntitlementCreateHandler(ref Entitlement entitlement);
+
+ public delegate void EntitlementDeleteHandler(ref Entitlement entitlement);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event EntitlementCreateHandler OnEntitlementCreate;
+
+ public event EntitlementDeleteHandler OnEntitlementDelete;
+
+ internal StoreManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnEntitlementCreate = OnEntitlementCreateImpl;
+ events.OnEntitlementDelete = OnEntitlementDeleteImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ [MonoPInvokeCallback]
+ private static void FetchSkusCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ FetchSkusHandler callback = (FetchSkusHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void FetchSkus(FetchSkusHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.FetchSkus(MethodsPtr, GCHandle.ToIntPtr(wrapped), FetchSkusCallbackImpl);
+ }
+
+ public Int32 CountSkus()
+ {
+ var ret = new Int32();
+ Methods.CountSkus(MethodsPtr, ref ret);
+ return ret;
+ }
+
+ public Sku GetSku(Int64 skuId)
+ {
+ var ret = new Sku();
+ var res = Methods.GetSku(MethodsPtr, skuId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public Sku GetSkuAt(Int32 index)
+ {
+ var ret = new Sku();
+ var res = Methods.GetSkuAt(MethodsPtr, index, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void FetchEntitlementsCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ FetchEntitlementsHandler callback = (FetchEntitlementsHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void FetchEntitlements(FetchEntitlementsHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.FetchEntitlements(MethodsPtr, GCHandle.ToIntPtr(wrapped), FetchEntitlementsCallbackImpl);
+ }
+
+ public Int32 CountEntitlements()
+ {
+ var ret = new Int32();
+ Methods.CountEntitlements(MethodsPtr, ref ret);
+ return ret;
+ }
+
+ public Entitlement GetEntitlement(Int64 entitlementId)
+ {
+ var ret = new Entitlement();
+ var res = Methods.GetEntitlement(MethodsPtr, entitlementId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public Entitlement GetEntitlementAt(Int32 index)
+ {
+ var ret = new Entitlement();
+ var res = Methods.GetEntitlementAt(MethodsPtr, index, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public bool HasSkuEntitlement(Int64 skuId)
+ {
+ var ret = new bool();
+ var res = Methods.HasSkuEntitlement(MethodsPtr, skuId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void StartPurchaseCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ StartPurchaseHandler callback = (StartPurchaseHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void StartPurchase(Int64 skuId, StartPurchaseHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.StartPurchase(MethodsPtr, skuId, GCHandle.ToIntPtr(wrapped), StartPurchaseCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnEntitlementCreateImpl(IntPtr ptr, ref Entitlement entitlement)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.StoreManagerInstance.OnEntitlementCreate != null)
+ {
+ d.StoreManagerInstance.OnEntitlementCreate.Invoke(ref entitlement);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnEntitlementDeleteImpl(IntPtr ptr, ref Entitlement entitlement)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.StoreManagerInstance.OnEntitlementDelete != null)
+ {
+ d.StoreManagerInstance.OnEntitlementDelete.Invoke(ref entitlement);
+ }
+ }
+ }
+
+ public partial class VoiceManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SettingsUpdateHandler(IntPtr ptr);
+
+ internal SettingsUpdateHandler OnSettingsUpdate;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetInputModeMethod(IntPtr methodsPtr, ref InputMode inputMode);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SetInputModeCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SetInputModeMethod(IntPtr methodsPtr, InputMode inputMode, IntPtr callbackData, SetInputModeCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result IsSelfMuteMethod(IntPtr methodsPtr, ref bool mute);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetSelfMuteMethod(IntPtr methodsPtr, bool mute);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result IsSelfDeafMethod(IntPtr methodsPtr, ref bool deaf);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetSelfDeafMethod(IntPtr methodsPtr, bool deaf);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result IsLocalMuteMethod(IntPtr methodsPtr, Int64 userId, ref bool mute);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetLocalMuteMethod(IntPtr methodsPtr, Int64 userId, bool mute);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetLocalVolumeMethod(IntPtr methodsPtr, Int64 userId, ref byte volume);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result SetLocalVolumeMethod(IntPtr methodsPtr, Int64 userId, byte volume);
+
+ internal GetInputModeMethod GetInputMode;
+
+ internal SetInputModeMethod SetInputMode;
+
+ internal IsSelfMuteMethod IsSelfMute;
+
+ internal SetSelfMuteMethod SetSelfMute;
+
+ internal IsSelfDeafMethod IsSelfDeaf;
+
+ internal SetSelfDeafMethod SetSelfDeaf;
+
+ internal IsLocalMuteMethod IsLocalMute;
+
+ internal SetLocalMuteMethod SetLocalMute;
+
+ internal GetLocalVolumeMethod GetLocalVolume;
+
+ internal SetLocalVolumeMethod SetLocalVolume;
+ }
+
+ public delegate void SetInputModeHandler(Result result);
+
+ public delegate void SettingsUpdateHandler();
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event SettingsUpdateHandler OnSettingsUpdate;
+
+ internal VoiceManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnSettingsUpdate = OnSettingsUpdateImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ public InputMode GetInputMode()
+ {
+ var ret = new InputMode();
+ var res = Methods.GetInputMode(MethodsPtr, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void SetInputModeCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ SetInputModeHandler callback = (SetInputModeHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void SetInputMode(InputMode inputMode, SetInputModeHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.SetInputMode(MethodsPtr, inputMode, GCHandle.ToIntPtr(wrapped), SetInputModeCallbackImpl);
+ }
+
+ public bool IsSelfMute()
+ {
+ var ret = new bool();
+ var res = Methods.IsSelfMute(MethodsPtr, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public void SetSelfMute(bool mute)
+ {
+ var res = Methods.SetSelfMute(MethodsPtr, mute);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public bool IsSelfDeaf()
+ {
+ var ret = new bool();
+ var res = Methods.IsSelfDeaf(MethodsPtr, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public void SetSelfDeaf(bool deaf)
+ {
+ var res = Methods.SetSelfDeaf(MethodsPtr, deaf);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public bool IsLocalMute(Int64 userId)
+ {
+ var ret = new bool();
+ var res = Methods.IsLocalMute(MethodsPtr, userId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public void SetLocalMute(Int64 userId, bool mute)
+ {
+ var res = Methods.SetLocalMute(MethodsPtr, userId, mute);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ public byte GetLocalVolume(Int64 userId)
+ {
+ var ret = new byte();
+ var res = Methods.GetLocalVolume(MethodsPtr, userId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public void SetLocalVolume(Int64 userId, byte volume)
+ {
+ var res = Methods.SetLocalVolume(MethodsPtr, userId, volume);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnSettingsUpdateImpl(IntPtr ptr)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.VoiceManagerInstance.OnSettingsUpdate != null)
+ {
+ d.VoiceManagerInstance.OnSettingsUpdate.Invoke();
+ }
+ }
+ }
+
+ public partial class AchievementManager
+ {
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIEvents
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void UserAchievementUpdateHandler(IntPtr ptr, ref UserAchievement userAchievement);
+
+ internal UserAchievementUpdateHandler OnUserAchievementUpdate;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal partial struct FFIMethods
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SetUserAchievementCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void SetUserAchievementMethod(IntPtr methodsPtr, Int64 achievementId, byte percentComplete, IntPtr callbackData, SetUserAchievementCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FetchUserAchievementsCallback(IntPtr ptr, Result result);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void FetchUserAchievementsMethod(IntPtr methodsPtr, IntPtr callbackData, FetchUserAchievementsCallback callback);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate void CountUserAchievementsMethod(IntPtr methodsPtr, ref Int32 count);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetUserAchievementMethod(IntPtr methodsPtr, Int64 userAchievementId, ref UserAchievement userAchievement);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ internal delegate Result GetUserAchievementAtMethod(IntPtr methodsPtr, Int32 index, ref UserAchievement userAchievement);
+
+ internal SetUserAchievementMethod SetUserAchievement;
+
+ internal FetchUserAchievementsMethod FetchUserAchievements;
+
+ internal CountUserAchievementsMethod CountUserAchievements;
+
+ internal GetUserAchievementMethod GetUserAchievement;
+
+ internal GetUserAchievementAtMethod GetUserAchievementAt;
+ }
+
+ public delegate void SetUserAchievementHandler(Result result);
+
+ public delegate void FetchUserAchievementsHandler(Result result);
+
+ public delegate void UserAchievementUpdateHandler(ref UserAchievement userAchievement);
+
+ private IntPtr MethodsPtr;
+
+ private Object MethodsStructure;
+
+ private FFIMethods Methods
+ {
+ get
+ {
+ if (MethodsStructure == null)
+ {
+ MethodsStructure = Marshal.PtrToStructure(MethodsPtr, typeof(FFIMethods));
+ }
+ return (FFIMethods)MethodsStructure;
+ }
+
+ }
+
+ public event UserAchievementUpdateHandler OnUserAchievementUpdate;
+
+ internal AchievementManager(IntPtr ptr, IntPtr eventsPtr, ref FFIEvents events)
+ {
+ if (eventsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ InitEvents(eventsPtr, ref events);
+ MethodsPtr = ptr;
+ if (MethodsPtr == IntPtr.Zero) {
+ throw new ResultException(Result.InternalError);
+ }
+ }
+
+ private void InitEvents(IntPtr eventsPtr, ref FFIEvents events)
+ {
+ events.OnUserAchievementUpdate = OnUserAchievementUpdateImpl;
+ Marshal.StructureToPtr(events, eventsPtr, false);
+ }
+
+ [MonoPInvokeCallback]
+ private static void SetUserAchievementCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ SetUserAchievementHandler callback = (SetUserAchievementHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void SetUserAchievement(Int64 achievementId, byte percentComplete, SetUserAchievementHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.SetUserAchievement(MethodsPtr, achievementId, percentComplete, GCHandle.ToIntPtr(wrapped), SetUserAchievementCallbackImpl);
+ }
+
+ [MonoPInvokeCallback]
+ private static void FetchUserAchievementsCallbackImpl(IntPtr ptr, Result result)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ FetchUserAchievementsHandler callback = (FetchUserAchievementsHandler)h.Target;
+ h.Free();
+ callback(result);
+ }
+
+ public void FetchUserAchievements(FetchUserAchievementsHandler callback)
+ {
+ GCHandle wrapped = GCHandle.Alloc(callback);
+ Methods.FetchUserAchievements(MethodsPtr, GCHandle.ToIntPtr(wrapped), FetchUserAchievementsCallbackImpl);
+ }
+
+ public Int32 CountUserAchievements()
+ {
+ var ret = new Int32();
+ Methods.CountUserAchievements(MethodsPtr, ref ret);
+ return ret;
+ }
+
+ public UserAchievement GetUserAchievement(Int64 userAchievementId)
+ {
+ var ret = new UserAchievement();
+ var res = Methods.GetUserAchievement(MethodsPtr, userAchievementId, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ public UserAchievement GetUserAchievementAt(Int32 index)
+ {
+ var ret = new UserAchievement();
+ var res = Methods.GetUserAchievementAt(MethodsPtr, index, ref ret);
+ if (res != Result.Ok)
+ {
+ throw new ResultException(res);
+ }
+ return ret;
+ }
+
+ [MonoPInvokeCallback]
+ private static void OnUserAchievementUpdateImpl(IntPtr ptr, ref UserAchievement userAchievement)
+ {
+ GCHandle h = GCHandle.FromIntPtr(ptr);
+ Discord d = (Discord)h.Target;
+ if (d.AchievementManagerInstance.OnUserAchievementUpdate != null)
+ {
+ d.AchievementManagerInstance.OnUserAchievementUpdate.Invoke(ref userAchievement);
+ }
+ }
+ }
+}
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Core.cs.meta b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Core.cs.meta
new file mode 100644
index 000000000..86b3bafa7
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/Core.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 322f7411488994c4ba05fef35275c9ae
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ImageManager.cs b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ImageManager.cs
new file mode 100644
index 000000000..292e23004
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ImageManager.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Runtime.InteropServices;
+#if UNITY_EDITOR || UNITY_STANDALONE
+using UnityEngine;
+#endif
+
+namespace Discord
+{
+ public partial struct ImageHandle
+ {
+ static public ImageHandle User(Int64 id)
+ {
+ return User(id, 128);
+ }
+
+ static public ImageHandle User(Int64 id, UInt32 size)
+ {
+ return new ImageHandle
+ {
+ Type = ImageType.User,
+ Id = id,
+ Size = size,
+ };
+ }
+ }
+
+ public partial class ImageManager
+ {
+ public void Fetch(ImageHandle handle, FetchHandler callback)
+ {
+ Fetch(handle, false, callback);
+ }
+
+ public byte[] GetData(ImageHandle handle)
+ {
+ var dimensions = GetDimensions(handle);
+ var data = new byte[dimensions.Width * dimensions.Height * 4];
+ GetData(handle, data);
+ return data;
+ }
+
+#if UNITY_EDITOR || UNITY_STANDALONE
+ public Texture2D GetTexture(ImageHandle handle)
+ {
+ var dimensions = GetDimensions(handle);
+ var texture = new Texture2D((int)dimensions.Width, (int)dimensions.Height, TextureFormat.RGBA32, false, true);
+ texture.LoadRawTextureData(GetData(handle));
+ texture.Apply();
+ return texture;
+ }
+#endif
+ }
+}
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ImageManager.cs.meta b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ImageManager.cs.meta
new file mode 100644
index 000000000..09ee9e807
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/ImageManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9aaaf736e0538da4d921dda51e049299
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/LobbyManager.cs b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/LobbyManager.cs
new file mode 100644
index 000000000..c914ba832
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/LobbyManager.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Discord
+{
+ public partial class LobbyManager
+ {
+ public IEnumerable GetMemberUsers(Int64 lobbyID)
+ {
+ var memberCount = MemberCount(lobbyID);
+ var members = new List();
+ for (var i = 0; i < memberCount; i++)
+ {
+ members.Add(GetMemberUser(lobbyID, GetMemberUserId(lobbyID, i)));
+ }
+ return members;
+ }
+
+ public void SendLobbyMessage(Int64 lobbyID, string data, SendLobbyMessageHandler handler)
+ {
+ SendLobbyMessage(lobbyID, Encoding.UTF8.GetBytes(data), handler);
+ }
+ }
+}
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/LobbyManager.cs.meta b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/LobbyManager.cs.meta
new file mode 100644
index 000000000..27e758448
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/LobbyManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9f595176ca2beab4da4f6473f1a4d102
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StorageManager.cs b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StorageManager.cs
new file mode 100644
index 000000000..65cfe72d6
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StorageManager.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Discord
+{
+ public partial class StorageManager
+ {
+ public IEnumerable Files()
+ {
+ var fileCount = Count();
+ var files = new List();
+ for (var i = 0; i < fileCount; i++)
+ {
+ files.Add(StatAt(i));
+ }
+ return files;
+ }
+ }
+}
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StorageManager.cs.meta b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StorageManager.cs.meta
new file mode 100644
index 000000000..61eff1946
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StorageManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0de83ab0ec089db4eb806d35d6dd9558
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StoreManager.cs b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StoreManager.cs
new file mode 100644
index 000000000..48645767c
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StoreManager.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Discord
+{
+ public partial class StoreManager
+ {
+ public IEnumerable GetEntitlements()
+ {
+ var count = CountEntitlements();
+ var entitlements = new List();
+ for (var i = 0; i < count; i++)
+ {
+ entitlements.Add(GetEntitlementAt(i));
+ }
+ return entitlements;
+ }
+
+ public IEnumerable GetSkus()
+ {
+ var count = CountSkus();
+ var skus = new List();
+ for (var i = 0; i < count; i++)
+ {
+ skus.Add(GetSkuAt(i));
+ }
+ return skus;
+ }
+ }
+}
diff --git a/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StoreManager.cs.meta b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StoreManager.cs.meta
new file mode 100644
index 000000000..e30d05e17
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/DiscordGameSDK/StoreManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 12e503df03fd6734d8f085997e64656c
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/x86.meta b/Assets/Plugins/Discord/Plugins/x86.meta
new file mode 100644
index 000000000..e6186c0e5
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/x86.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 70173042601fc1846a90b0c8ea926df4
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll b/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll
new file mode 100644
index 000000000..8f1ee0a65
Binary files /dev/null and b/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll differ
diff --git a/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.lib b/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.lib
new file mode 100644
index 000000000..58ec2820f
Binary files /dev/null and b/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.lib differ
diff --git a/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.lib.meta b/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.lib.meta
new file mode 100644
index 000000000..641fd20c7
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.lib.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 42267c7ce7eae61448e2ea4ecbf34463
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.meta b/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.meta
new file mode 100644
index 000000000..8148be13c
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/x86/discord_game_sdk.dll.meta
@@ -0,0 +1,52 @@
+fileFormatVersion: 2
+guid: 7dc43ba202aaeee43b83eda90c7cf67b
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/x86_64.meta b/Assets/Plugins/Discord/Plugins/x86_64.meta
new file mode 100644
index 000000000..47f98a35a
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/x86_64.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e291cd87df3992b40b4cb0fc5f542185
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll
new file mode 100644
index 000000000..10a8928f9
Binary files /dev/null and b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll differ
diff --git a/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.lib b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.lib
new file mode 100644
index 000000000..8ab3d4cb4
Binary files /dev/null and b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.lib differ
diff --git a/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.lib.meta b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.lib.meta
new file mode 100644
index 000000000..388182ad2
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.lib.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0d629049536dd6044b09086f92fc7305
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.meta b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.meta
new file mode 100644
index 000000000..e6619e741
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dll.meta
@@ -0,0 +1,52 @@
+fileFormatVersion: 2
+guid: ffaf5645d42da1d40b14356395eb1bb8
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dylib b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dylib
new file mode 100644
index 000000000..24045f792
Binary files /dev/null and b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dylib differ
diff --git a/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dylib.meta b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dylib.meta
new file mode 100644
index 000000000..004bc8784
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.dylib.meta
@@ -0,0 +1,52 @@
+fileFormatVersion: 2
+guid: cbdb66c634dc7af4cb711bca303d2c1a
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.so b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.so
new file mode 100644
index 000000000..e46576062
Binary files /dev/null and b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.so differ
diff --git a/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.so.meta b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.so.meta
new file mode 100644
index 000000000..7d5559977
--- /dev/null
+++ b/Assets/Plugins/Discord/Plugins/x86_64/discord_game_sdk.so.meta
@@ -0,0 +1,52 @@
+fileFormatVersion: 2
+guid: f5327cb3294b2bc46a8451ef4c09a855
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Resources/Games/spaceSoccer.prefab b/Assets/Resources/Games/spaceSoccer.prefab
index b9fa051b0..6c4c7f88c 100644
--- a/Assets/Resources/Games/spaceSoccer.prefab
+++ b/Assets/Resources/Games/spaceSoccer.prefab
@@ -161,7 +161,7 @@ SpriteRenderer:
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
- m_WasSpriteAssigned: 1
+ m_WasSpriteAssigned: 0
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &422879747917861779
@@ -247,6 +247,88 @@ SpriteRenderer:
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
+--- !u!1 &469198566591224012
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4174617011276534241}
+ - component: {fileID: 3390970543398687787}
+ m_Layer: 0
+ m_Name: Background (3)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4174617011276534241
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 469198566591224012}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -24.2, y: -43.20976, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 5817910513783836992}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &3390970543398687787
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 469198566591224012}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -50
+ m_Sprite: {fileID: 21300000, guid: 8a95e066b3562f64eb8ec3bcfe316752, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 33.61111, y: 60.013557}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
--- !u!1 &846200884479471224
GameObject:
m_ObjectHideFlags: 0
@@ -900,14 +982,14 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3245650711660585577}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 3.384, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1447782230425103585}
- {fileID: 7679098324972434340}
- m_Father: {fileID: 3584310800769874311}
- m_RootOrder: 3
+ m_Father: {fileID: 1133941631262721853}
+ m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2934863208182244691
MonoBehaviour:
@@ -1010,6 +1092,88 @@ MonoBehaviour:
- {fileID: 6587980638921568367}
- {fileID: 3476345366608168900}
normalizedTime: 0.5
+--- !u!1 &3411083026472838044
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4610982973295183759}
+ - component: {fileID: 1702596997009001561}
+ m_Layer: 0
+ m_Name: Background (5)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4610982973295183759
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3411083026472838044}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 24.2, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 5817910513783836992}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &1702596997009001561
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3411083026472838044}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -50
+ m_Sprite: {fileID: 21300000, guid: 8a95e066b3562f64eb8ec3bcfe316752, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 33.61111, y: 60.013557}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
--- !u!1 &3584310800769874308
GameObject:
m_ObjectHideFlags: 0
@@ -1041,8 +1205,8 @@ Transform:
- {fileID: 8782824659731654599}
- {fileID: 1635378899211822444}
- {fileID: 5569079104020273780}
- - {fileID: 482351987616570803}
- - {fileID: 6448989353494316845}
+ - {fileID: 1133941631262721853}
+ - {fileID: 5817910513783836992}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -1062,6 +1226,10 @@ MonoBehaviour:
firstEnable: 0
ballRef: {fileID: 4170571896107082579}
kicker: {fileID: 2934863208182244691}
+ Background: {fileID: 7001609152551886569}
+ backgroundSprite:
+ - {fileID: -7443756053782179069, guid: 8a95e066b3562f64eb8ec3bcfe316752, type: 3}
+ - {fileID: -3192133289119773823, guid: 8a95e066b3562f64eb8ec3bcfe316752, type: 3}
ballDispensed: 0
--- !u!1 &3994873901200315503
GameObject:
@@ -1225,8 +1393,8 @@ Transform:
- {fileID: 3207667626390582044}
- {fileID: 1919782781487675894}
- {fileID: 1867556290772299826}
- m_Father: {fileID: 3584310800769874311}
- m_RootOrder: 4
+ m_Father: {fileID: 1133941631262721853}
+ m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &6562488500519841852
MonoBehaviour:
@@ -1251,6 +1419,88 @@ MonoBehaviour:
dispensing: 0
hitTimes: 0
canKick: 0
+--- !u!1 &4407241422380325920
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1213246257364922519}
+ - component: {fileID: 8341491302550769825}
+ m_Layer: 0
+ m_Name: Background (2)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1213246257364922519
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4407241422380325920}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 24.2, y: -43.20976, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 5817910513783836992}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &8341491302550769825
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4407241422380325920}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -50
+ m_Sprite: {fileID: 21300000, guid: 8a95e066b3562f64eb8ec3bcfe316752, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 33.61111, y: 60.013557}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
--- !u!1 &4832865564766322567
GameObject:
m_ObjectHideFlags: 0
@@ -1368,7 +1618,7 @@ SpriteRenderer:
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
- m_WasSpriteAssigned: 1
+ m_WasSpriteAssigned: 0
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &5041886038678738707
@@ -1699,6 +1949,110 @@ SpriteRenderer:
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
+--- !u!1 &7001609152551886569
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5817910513783836992}
+ - component: {fileID: 4826091915340610528}
+ - component: {fileID: 7055647918200424894}
+ m_Layer: 0
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &5817910513783836992
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7001609152551886569}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 5412829256935455910}
+ - {fileID: 1213246257364922519}
+ - {fileID: 4174617011276534241}
+ - {fileID: 5972595949109897037}
+ - {fileID: 4610982973295183759}
+ m_Father: {fileID: 3584310800769874311}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &4826091915340610528
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7001609152551886569}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 45eb7daf344474546ba5079bf18eae01, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ scrollSpeedX: 1
+ scrollSpeedY: -10
+ lengthX: 24.2
+ lengthY: 43.20976
+--- !u!212 &7055647918200424894
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7001609152551886569}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -50
+ m_Sprite: {fileID: 21300000, guid: 8a95e066b3562f64eb8ec3bcfe316752, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 33.61111, y: 60.013557}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
--- !u!1 &7718399668199529040
GameObject:
m_ObjectHideFlags: 0
@@ -1871,6 +2225,88 @@ MonoBehaviour:
handleType: 0
leftHandleLocalPosition: {x: -2.191154, y: 12.986072, z: 0}
rightHandleLocalPosition: {x: 2.191154, y: -12.986072, z: -0}
+--- !u!1 &8302891755395531529
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5412829256935455910}
+ - component: {fileID: 634669865258835666}
+ m_Layer: 0
+ m_Name: Background (1)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &5412829256935455910
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8302891755395531529}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: -43.20976, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 5817910513783836992}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &634669865258835666
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8302891755395531529}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -50
+ m_Sprite: {fileID: 21300000, guid: 8a95e066b3562f64eb8ec3bcfe316752, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 33.61111, y: 60.013557}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
--- !u!1 &8665788574861104969
GameObject:
m_ObjectHideFlags: 0
@@ -1954,6 +2390,88 @@ SpriteRenderer:
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
+--- !u!1 &8694765543703699111
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5972595949109897037}
+ - component: {fileID: 3835620216720001701}
+ m_Layer: 0
+ m_Name: Background (4)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &5972595949109897037
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8694765543703699111}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -24.2, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 5817910513783836992}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &3835620216720001701
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8694765543703699111}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -50
+ m_Sprite: {fileID: 21300000, guid: 8a95e066b3562f64eb8ec3bcfe316752, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 33.61111, y: 60.013557}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
--- !u!1 &8759919287013858049
GameObject:
m_ObjectHideFlags: 0
@@ -2036,6 +2554,58 @@ SpriteRenderer:
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
+--- !u!1 &8939783467731435080
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1133941631262721853}
+ - component: {fileID: 1608285238974590329}
+ m_Layer: 0
+ m_Name: SpaceKickerHolder
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1133941631262721853
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8939783467731435080}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 482351987616570803}
+ - {fileID: 6448989353494316845}
+ m_Father: {fileID: 3584310800769874311}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!95 &1608285238974590329
+Animator:
+ serializedVersion: 3
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8939783467731435080}
+ m_Enabled: 1
+ m_Avatar: {fileID: 0}
+ m_Controller: {fileID: 9100000, guid: 8c23103d97f33c64b9f025dcee60ae53, type: 2}
+ m_CullingMode: 0
+ m_UpdateMode: 0
+ m_ApplyRootMotion: 0
+ m_LinearVelocityBlending: 0
+ m_WarningMessage:
+ m_HasTransformHierarchy: 1
+ m_AllowConstantClipSamplingOptimization: 1
+ m_KeepAnimatorControllerStateOnDisable: 0
--- !u!1 &8974367849771788725
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerFloat.anim b/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerFloat.anim
new file mode 100644
index 000000000..3cce59250
--- /dev/null
+++ b/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerFloat.anim
@@ -0,0 +1,196 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: SpaceKickerFloat
+ serializedVersion: 6
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: {x: 0, y: 0, z: 0}
+ inSlope: {x: -0.7510683, y: 0, z: 0}
+ outSlope: {x: -0.7510683, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 3
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.4322971, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 2.8333333
+ value: {x: 0.100890815, y: -0.6036139, z: 0}
+ inSlope: {x: 0.55465823, y: 0, z: 0}
+ outSlope: {x: 0.55465823, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 3
+ inWeight: {x: 0.29686522, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.2664928, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 5.6833334
+ value: {x: 0, y: 0, z: 0}
+ inSlope: {x: -0.6860401, y: 0, z: 0}
+ outSlope: {x: -0.6860401, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 3
+ inWeight: {x: 0.4459167, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path:
+ m_ScaleCurves: []
+ m_FloatCurves: []
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings:
+ - serializedVersion: 2
+ path: 0
+ attribute: 1
+ script: {fileID: 0}
+ typeID: 4
+ customType: 0
+ isPPtrCurve: 0
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 5.6833334
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 1
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: -0.7510683
+ outSlope: -0.7510683
+ tangentMode: 0
+ weightedMode: 3
+ inWeight: 0.33333334
+ outWeight: 0.41011798
+ - serializedVersion: 3
+ time: 5.6833334
+ value: 0
+ inSlope: -0.6860401
+ outSlope: -0.6860401
+ tangentMode: 0
+ weightedMode: 3
+ inWeight: 0.47125286
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.x
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 3
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 2.8333333
+ value: -0.6036139
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 3
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 5.6833334
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 3
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.y
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 2.8333333
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 5.6833334
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.z
+ path:
+ classID: 4
+ script: {fileID: 0}
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 1
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerFloat.anim.meta b/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerFloat.anim.meta
new file mode 100644
index 000000000..d1c7adc3c
--- /dev/null
+++ b/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerFloat.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 53ea9a8eae9959545968bd4ba1ace783
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerHolder.controller b/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerHolder.controller
new file mode 100644
index 000000000..f71d25681
--- /dev/null
+++ b/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerHolder.controller
@@ -0,0 +1,72 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1102 &-1222172413647602699
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: SpaceKickerFloat
+ m_Speed: 0.69
+ m_CycleOffset: 0
+ m_Transitions: []
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: 53ea9a8eae9959545968bd4ba1ace783, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
+--- !u!91 &9100000
+AnimatorController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: SpaceKickerHolder
+ serializedVersion: 5
+ m_AnimatorParameters: []
+ m_AnimatorLayers:
+ - serializedVersion: 5
+ m_Name: Base Layer
+ m_StateMachine: {fileID: 2021112558258871918}
+ m_Mask: {fileID: 0}
+ m_Motions: []
+ m_Behaviours: []
+ m_BlendingMode: 0
+ m_SyncedLayerIndex: -1
+ m_DefaultWeight: 0
+ m_IKPass: 0
+ m_SyncedLayerAffectsTiming: 0
+ m_Controller: {fileID: 9100000}
+--- !u!1107 &2021112558258871918
+AnimatorStateMachine:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Base Layer
+ m_ChildStates:
+ - serializedVersion: 1
+ m_State: {fileID: -1222172413647602699}
+ m_Position: {x: 200, y: 0, z: 0}
+ m_ChildStateMachines: []
+ m_AnyStateTransitions: []
+ m_EntryTransitions: []
+ m_StateMachineTransitions: {}
+ m_StateMachineBehaviours: []
+ m_AnyStatePosition: {x: 50, y: 20, z: 0}
+ m_EntryPosition: {x: 50, y: 120, z: 0}
+ m_ExitPosition: {x: 800, y: 120, z: 0}
+ m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
+ m_DefaultState: {fileID: -1222172413647602699}
diff --git a/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerHolder.controller.meta b/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerHolder.controller.meta
new file mode 100644
index 000000000..9848a7196
--- /dev/null
+++ b/Assets/Resources/Sprites/Games/SpaceSoccer/Animations/SpaceKickerHolder.controller.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8c23103d97f33c64b9f025dcee60ae53
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 9100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Resources/Sprites/Games/SpaceSoccer/background.png b/Assets/Resources/Sprites/Games/SpaceSoccer/background.png
new file mode 100644
index 000000000..0a24e216d
Binary files /dev/null and b/Assets/Resources/Sprites/Games/SpaceSoccer/background.png differ
diff --git a/Assets/Resources/Sprites/Games/SpaceSoccer/background.png.meta b/Assets/Resources/Sprites/Games/SpaceSoccer/background.png.meta
new file mode 100644
index 000000000..61bd43056
--- /dev/null
+++ b/Assets/Resources/Sprites/Games/SpaceSoccer/background.png.meta
@@ -0,0 +1,168 @@
+fileFormatVersion: 2
+guid: 8a95e066b3562f64eb8ec3bcfe316752
+TextureImporter:
+ internalIDToNameTable:
+ - first:
+ 213: -7443756053782179069
+ second: background_0
+ - first:
+ 213: -3192133289119773823
+ second: background_1
+ externalObjects: {}
+ serializedVersion: 11
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 2
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 2
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: WebGL
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 2
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites:
+ - serializedVersion: 2
+ name: background_0
+ rect:
+ serializedVersion: 2
+ x: 37
+ y: 117
+ width: 165
+ height: 165
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ outline: []
+ physicsShape: []
+ tessellationDetail: 0
+ bones: []
+ spriteID: 30356abce4772b890800000000000000
+ internalID: -7443756053782179069
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ - serializedVersion: 2
+ name: background_1
+ rect:
+ serializedVersion: 2
+ x: 205
+ y: 188
+ width: 70
+ height: 70
+ alignment: 0
+ pivot: {x: 0, y: 0}
+ border: {x: 0, y: 0, z: 0, w: 0}
+ outline: []
+ physicsShape: []
+ tessellationDetail: 0
+ bones: []
+ spriteID: 18b015aafa343b3d0800000000000000
+ internalID: -3192133289119773823
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Common/Parallax.cs b/Assets/Scripts/Common/Parallax.cs
new file mode 100644
index 000000000..72d80b01b
--- /dev/null
+++ b/Assets/Scripts/Common/Parallax.cs
@@ -0,0 +1,50 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace RhythmHeavenMania.Common
+{
+ public class Parallax : MonoBehaviour
+ {
+ [SerializeField]
+ private Vector2 parallaxEffectMultiplier;
+
+ private Transform camTransform;
+ private Vector3 lastCamPos;
+ public float textureUnitSizeX;
+
+ public bool sprite = true;
+
+ private void Start()
+ {
+ camTransform = Camera.main.transform;
+ lastCamPos = camTransform.position;
+ /*if (sprite)
+ {
+ Sprite sprite = GetComponent().sprite;
+ Texture2D texture = sprite.texture;
+ textureUnitSizeX = texture.width / sprite.pixelsPerUnit;
+ }
+ else
+ {
+ Image image = GetComponent();
+ Texture texture = image.mainTexture;
+ textureUnitSizeX = texture.width / image.pixelsPerUnit;
+ }*/
+ }
+
+ private void LateUpdate()
+ {
+ Vector3 deltaMovement = camTransform.position - lastCamPos;
+ transform.position += new Vector3(deltaMovement.x * parallaxEffectMultiplier.x, deltaMovement.y * parallaxEffectMultiplier.y, 0);
+ lastCamPos = camTransform.position;
+
+ if (Mathf.Abs(camTransform.position.x - transform.position.x) >= textureUnitSizeX)
+ {
+ float offsetPosX = (camTransform.position.x - transform.position.x) % textureUnitSizeX;
+ transform.position = new Vector3(camTransform.position.x + offsetPosX, transform.position.y);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Common/Parallax.cs.meta b/Assets/Scripts/Common/Parallax.cs.meta
new file mode 100644
index 000000000..9005802db
--- /dev/null
+++ b/Assets/Scripts/Common/Parallax.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: eaa95a9ff0cbc6c47a89367e6da5c7bd
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Common/Scroll.cs b/Assets/Scripts/Common/Scroll.cs
new file mode 100644
index 000000000..1b3c1b335
--- /dev/null
+++ b/Assets/Scripts/Common/Scroll.cs
@@ -0,0 +1,34 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace RhythmHeavenMania.Common
+{
+ public class Scroll : MonoBehaviour
+ {
+ public float scrollSpeedX;
+ public float scrollSpeedY;
+ Vector3 startPos;
+
+ public float lengthX;
+ public float lengthY = 43.20976f;
+
+ private void Start()
+ {
+ startPos = transform.localPosition;
+ UpdatePos();
+ }
+
+ private void Update()
+ {
+ UpdatePos();
+ }
+
+ private void UpdatePos()
+ {
+ float newPosX = Mathf.Repeat(Time.time * scrollSpeedX, lengthX);
+ float newPosY = Mathf.Repeat(Time.time * scrollSpeedY, lengthY);
+ transform.localPosition = startPos + new Vector3(1 * newPosX, 1 * newPosY);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Common/Scroll.cs.meta b/Assets/Scripts/Common/Scroll.cs.meta
new file mode 100644
index 000000000..706f70b10
--- /dev/null
+++ b/Assets/Scripts/Common/Scroll.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 45eb7daf344474546ba5079bf18eae01
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/DiscordController.cs b/Assets/Scripts/DiscordController.cs
new file mode 100644
index 000000000..79b841b00
--- /dev/null
+++ b/Assets/Scripts/DiscordController.cs
@@ -0,0 +1,110 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using System.Text;
+using Discord;
+using System;
+
+namespace RhythmHeavenMania.DiscordRPC
+{
+ public class DiscordController : MonoBehaviour
+ {
+ public Discord.Discord discord;
+
+ public static DiscordController instance { get; set; }
+
+ private long lastStartTime;
+
+ private void Awake()
+ {
+ // instance = this;
+ }
+
+ private void Start()
+ {
+ DontDestroyOnLoad(this.gameObject);
+ }
+
+ private void OnApplicationQuit()
+ {
+ Disconnect();
+ }
+
+ public void Connect()
+ {
+ discord = new Discord.Discord(DiscordRPC.clientID, (System.UInt64)Discord.CreateFlags.Default);
+ }
+
+ public void Disconnect()
+ {
+ if (discord != null)
+ {
+ discord.Dispose();
+ }
+ }
+
+ public void UpdateActivity(string stateText, string stateDetails, bool updateTime = false)
+ {
+ var activityManager = discord.GetActivityManager();
+ var activity = new Activity { };
+
+
+ activity = new Activity
+ {
+ State = stateText,
+ Details = stateDetails,
+ Assets =
+ {
+ LargeImage = "logo",
+ LargeText = "Rhythm Heaven Mania is based on the Rhythm Heaven series that attempts to recreate every minigame with customizability!"
+ },
+ Instance = true,
+ };
+
+ if (updateTime == true)
+ {
+ lastStartTime = DateTimeOffset.Now.ToUnixTimeSeconds();
+ activity.Timestamps.Start = lastStartTime;
+ }
+ else
+ {
+ activity.Timestamps.Start = lastStartTime;
+ }
+
+ activityManager.UpdateActivity(activity, (result) => {
+ if (result == Discord.Result.Ok)
+ {
+ Debug.Log("Update Success!");
+ }
+ else
+ {
+ Debug.Log("Update Failed");
+ }
+ });
+ }
+
+ public void ClearActivity()
+ {
+ var activityManager = discord.GetActivityManager();
+ activityManager.ClearActivity((result) => {
+ if (result == Discord.Result.Ok)
+ {
+ Debug.Log("Clear Success!");
+ }
+ else
+ {
+ Debug.Log("Clear Failed");
+ }
+ });
+ }
+
+ void Update()
+ {
+ if (discord != null)
+ {
+ discord.RunCallbacks();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/DiscordController.cs.meta b/Assets/Scripts/DiscordController.cs.meta
new file mode 100644
index 000000000..3c0bf87b1
--- /dev/null
+++ b/Assets/Scripts/DiscordController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4fda65d1df0676c49913aaa4c138c6f5
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/DiscordRPC.cs b/Assets/Scripts/DiscordRPC.cs
new file mode 100644
index 000000000..f621e943e
--- /dev/null
+++ b/Assets/Scripts/DiscordRPC.cs
@@ -0,0 +1,39 @@
+using UnityEngine;
+
+namespace RhythmHeavenMania.DiscordRPC
+{
+ public class DiscordRPC : MonoBehaviour
+ {
+ public static long clientID = 937480118518042675;
+
+ private static void DiscordControllerCheck()
+ {
+ if (DiscordController.instance == null)
+ {
+ var discordController = new GameObject("DiscordController");
+ var di = discordController.AddComponent();
+ DiscordController.instance = di;
+ di.Connect();
+ }
+ }
+
+ public static void Connect()
+ {
+ DiscordControllerCheck();
+ DiscordController.instance.Connect();
+ }
+
+ public static void UpdateActivity(string state = null, string details = null, bool updateTime = false)
+ {
+ DiscordControllerCheck();
+ DiscordController.instance.UpdateActivity(details, state, updateTime);
+ }
+
+ public static void Disconnect()
+ {
+ DiscordControllerCheck();
+ DiscordController.instance.Disconnect();
+ Destroy(DiscordController.instance.gameObject);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/DiscordRPC.cs.meta b/Assets/Scripts/DiscordRPC.cs.meta
new file mode 100644
index 000000000..4c540bab4
--- /dev/null
+++ b/Assets/Scripts/DiscordRPC.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 896ff10d4b52e8c42ad72ec0545f8389
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs
index 66f45d26b..553efc223 100644
--- a/Assets/Scripts/GameManager.cs
+++ b/Assets/Scripts/GameManager.cs
@@ -18,19 +18,16 @@ namespace RhythmHeavenMania
private List preloadedGames = new List();
public List SoundObjects = new List();
-
[Header("Components")]
public TextAsset txt;
public Camera GameCamera, CursorCam;
public CircleCursor CircleCursor;
[HideInInspector] public GameObject GamesHolder;
-
[Header("Games")]
public string currentGame;
Coroutine currentGameSwitchIE;
-
[Header("Properties")]
public int currentEvent, currentTempoEvent;
public float startOffset;
@@ -38,6 +35,10 @@ namespace RhythmHeavenMania
public float startBeat;
private GameObject currentGameO;
public bool autoplay;
+ public int BeatmapEntities()
+ {
+ return Beatmap.entities.Count + Beatmap.tempoChanges.Count;
+ }
public static GameManager instance { get; private set; }
private EventCaller eventCaller;
diff --git a/Assets/Scripts/Games/SpaceSoccer/Ball.cs b/Assets/Scripts/Games/SpaceSoccer/Ball.cs
index 693ffbd29..209a6aef8 100644
--- a/Assets/Scripts/Games/SpaceSoccer/Ball.cs
+++ b/Assets/Scripts/Games/SpaceSoccer/Ball.cs
@@ -98,7 +98,7 @@ namespace RhythmHeavenMania.Games.SpaceSoccer
if (dispensing)
{
float normalizedBeatAnim = Conductor.instance.GetLoopPositionFromBeat(dispensedBeat, 2.35f);
- holder.transform.position = dispenseCurve.GetPoint(normalizedBeatAnim);
+ holder.transform.localPosition = dispenseCurve.GetPoint(normalizedBeatAnim);
spriteHolder.transform.eulerAngles = new Vector3(0, 0, Mathf.Lerp(0f, -1440f, normalizedBeatAnim));
/*if (PlayerInput.Pressed())
@@ -112,7 +112,7 @@ namespace RhythmHeavenMania.Games.SpaceSoccer
else if (kicked.enabled)
{
float normalizedBeatAnim = Conductor.instance.GetLoopPositionFromBeat(kicked.startBeat, 1.5f);
- holder.transform.position = kickCurve.GetPoint(normalizedBeatAnim);
+ holder.transform.localPosition = kickCurve.GetPoint(normalizedBeatAnim);
if (!lastKickLeft)
{
spriteHolder.transform.eulerAngles = new Vector3(0, 0, Mathf.Lerp(lastSpriteRot, lastSpriteRot - 360f, normalizedBeatAnim));
@@ -141,7 +141,7 @@ namespace RhythmHeavenMania.Games.SpaceSoccer
else if (highKicked.enabled)
{
float normalizedBeatAnim = Conductor.instance.GetLoopPositionFromBeat(highKicked.startBeat, 1.8f);
- holder.transform.position = highKickCurve.GetPoint(normalizedBeatAnim);
+ holder.transform.localPosition = highKickCurve.GetPoint(normalizedBeatAnim);
spriteHolder.transform.eulerAngles = new Vector3(0, 0, Mathf.Lerp(lastSpriteRot, lastSpriteRot + 360f, normalizedBeatAnim));
// if (state.perfect) Debug.Break();
@@ -165,7 +165,7 @@ namespace RhythmHeavenMania.Games.SpaceSoccer
else if (toe.enabled)
{
float normalizedBeatAnim = Conductor.instance.GetLoopPositionFromBeat(toe.startBeat, 1.85f);
- holder.transform.position = toeCurve.GetPoint(normalizedBeatAnim);
+ holder.transform.localPosition = toeCurve.GetPoint(normalizedBeatAnim);
spriteHolder.transform.eulerAngles = new Vector3(0, 0, Mathf.Lerp(lastSpriteRot, -860f, normalizedBeatAnim));
}
}
diff --git a/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs b/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs
index e41da92de..afb0c253f 100644
--- a/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs
+++ b/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs
@@ -11,6 +11,8 @@ namespace RhythmHeavenMania.Games.SpaceSoccer
[Header("Components")]
[SerializeField] private GameObject ballRef;
[SerializeField] private Kicker kicker;
+ [SerializeField] private GameObject Background;
+ [SerializeField] private Sprite[] backgroundSprite;
[Header("Properties")]
[SerializeField] private bool ballDispensed;
@@ -22,11 +24,29 @@ namespace RhythmHeavenMania.Games.SpaceSoccer
instance = this;
}
+ private void Start()
+ {
+ for (int x = 0; x < Random.Range(9, 12); x++)
+ {
+ for (int y = 0; y < Random.Range(6, 9); y++)
+ {
+ GameObject test = new GameObject("test");
+ test.transform.parent = Background.transform;
+ test.AddComponent().sprite = backgroundSprite[Random.Range(0, 2)];
+ test.GetComponent().sortingOrder = -50;
+ test.transform.localPosition = new Vector3(Random.Range(-15f, 15f), Random.Range(-15f, 15f));
+ test.transform.localScale = new Vector3(0.52f, 0.52f);
+ }
+ }
+ }
+
private void Update()
{
if (ballDispensed)
{
}
+
+
}
public void Dispense(float beat)
diff --git a/Assets/Scripts/LevelEditor/Editor.cs b/Assets/Scripts/LevelEditor/Editor.cs
index d537e03f0..c3fb8bf7d 100644
--- a/Assets/Scripts/LevelEditor/Editor.cs
+++ b/Assets/Scripts/LevelEditor/Editor.cs
@@ -50,6 +50,7 @@ namespace RhythmHeavenMania.Editor
[Header("Properties")]
private bool changedMusic = false;
private string currentRemixPath = "";
+ private int lastEditorObjectsCount = 0;
public static Editor instance { get; private set; }
@@ -84,6 +85,8 @@ namespace RhythmHeavenMania.Editor
Tooltip.AddTooltip(MusicSelectBTN.gameObject, "Music Select");
Tooltip.AddTooltip(EditorSettingsBTN.gameObject, "Editor Settings [Ctrl+Shift+O]");
Tooltip.AddTooltip(EditorThemeBTN.gameObject, "Editor Theme");
+
+ UpdateEditorStatus(true);
}
public void Update()
@@ -173,6 +176,13 @@ namespace RhythmHeavenMania.Editor
SaveRemix(false);
}
}
+
+ if (lastEditorObjectsCount != GameManager.instance.BeatmapEntities())
+ {
+ UpdateEditorStatus(false);
+ }
+
+ lastEditorObjectsCount = GameManager.instance.BeatmapEntities();
}
public static Sprite GameIcon(string name)
@@ -358,6 +368,12 @@ namespace RhythmHeavenMania.Editor
#endregion
+
+ private void UpdateEditorStatus(bool updateTime)
+ {
+ DiscordRPC.DiscordRPC.UpdateActivity("In Editor", $"Objects: {GameManager.instance.Beatmap.entities.Count + GameManager.instance.Beatmap.tempoChanges.Count}", updateTime);
+ }
+
public string GetJson()
{
string json = string.Empty;