jimmy tremblay-Bernier c1bf5a4ca1 initial commit
2022-03-12 22:04:30 -04:00

313 lines
9.7 KiB
C#

using UnityEngine;
using System.Runtime.InteropServices;
using System.IO;
using System;
using UnityEngine.UI;
using UnityEngine.XR;
using System.Xml;
using System.Collections.Generic;
public class OVSDK : MonoBehaviour
{
public static string _SDKVersion = "0.4.0";
public delegate void OVSDKEventCallback(int nMsgType, string sMsgContent);
public delegate void OVSDKBuyCallback(string sItem, string sOutTradeNo, string sInTradeNo, string sErr);
public delegate void OVSDKSaveGameDataCallback(int nError, string sMsg);
public delegate void OVSDKLoadGameDataCallback(int nError, string sMsg, IntPtr data, int len);
static OVSDKEventCallback _DllEventCallback = null;
[StructLayout(LayoutKind.Sequential)]
public struct DeviceInfo
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string sNo; //Omni serial-number;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string sUID; //Omni device UID in Omniverse backend.
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string sShopName; //Shop name
[MarshalAs(UnmanagedType.U4)]
public int nId; //for internal usage
[MarshalAs(UnmanagedType.U4)]
public int nShop; //Shop Id
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string sCategory;//for internal usage
}
[StructLayout(LayoutKind.Sequential)]
public struct UserInfo
{
[MarshalAs(UnmanagedType.U4)]
public int nUserId; //The player's unique account id in Omniverse;
[MarshalAs(UnmanagedType.U4)]
public int nGameId; //GameID from OVSDK::Init
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
string sCookies; //for internal usage
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string sGameSDKType; //Omniverse SDK type, "unty": unity-SDK, "ue4x": UE4-SDK;
[MarshalAs(UnmanagedType.U4)]
public int nGameSDKVersion; //Omniverse SDK version, version string 0xAAAA.0xBB.0xCC, format as uint32 0xAAAABBCC;
[MarshalAs(UnmanagedType.U4)]
public int nGamePrepareLeft; //Game-prepare time left, use for single game ticket mode;
[MarshalAs(UnmanagedType.U4)]
public int nGameDurationLeft; //Game-play time left;
[MarshalAs(UnmanagedType.U4)]
public int nGamePrepare; //Game-prepare time, each game can config its own prepare time. The time is used to choose level, match game, but the duration is limited.
//If level or match start, you should call OVSDK.ConfirmPlayGame() to tell SDK countdown game-time now.
[MarshalAs(UnmanagedType.U4)]
public int nGameDuration; //Gameplay time;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string sBillingMode; //Ticket mode, "timing", "timingreal", "direct_game", "shiyu_coin", "game_auth", "timescount";
[MarshalAs(UnmanagedType.U4)]
public int nUserProp; //for internal usage;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string sConsolePath; //for internal usage;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] nCoupleRate; //Omni couple rate data of default
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] nUserCoupleRate; //Omni couple rate setting about user
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 60)]
string sReserved; //for internal usage;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string sQrcode; //The omniverse trade number for this game ticket;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string sWeb2d; //for internal usage;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string sReserved2; //for internal usage;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string sUserName; //Player's nick game in Omniverse;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string sUserPhone; //Player's phone number registered in Omniverse; (maybe masked, some character replaced by '*' for privacy)
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string sUserEmail; //Player's email registered in Omniverse; (maybe masked)
public double nUserBalance; //Player's balance in Omniverse; (In-game purchase costs this balance)
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 124)]
public string sUserIcon; //Player's portrait icon url;
[MarshalAs(UnmanagedType.U4)]
public int nDesktopDurationLeft;//for internal usage;
}
// public interface for Game-developer
static bool _bIniting = false, _bInitDone = false, _bJustInitDone = false;
static string _sInitResult;
static int _nInitResultCode = 0;
static OVSDK _Instance = null;
public static OVSDK instance
{
get {
if (null == _Instance)
{
_Instance = GameObject.FindObjectOfType<OVSDK>();
if (null == _Instance)
{
GameObject go = new GameObject("OVSDK_GlobalInstance");
_Instance = go.AddComponent<OVSDK>();
DontDestroyOnLoad(go);
}
}
return _Instance;
}
}
public static void SetCallBackOnMsgFromSDK(OVSDKEventCallback cbHvMsg)
{
_DllEventCallback = cbHvMsg;
}
public static void Init(int nGameId, string sGameKey, string sParam)
{
if (null == OVSDK.instance) {
Debug.LogError("get OVSDK.instance failed.");
}
//if (_bIniting || _bInitDone) {
// Debug.LogError("OVSDK should Init once only.");
//}
_bIniting = true;
_bInitDone = _bJustInitDone = false;
sParam = sParam + ";sdk_type=unty;sdk_version=" + _SDKVersion;
DllInit(nGameId, sGameKey, sParam, onEventFromSDK, IntPtr.Zero);
}
public static bool HasInitialized()
{
return _bInitDone;
}
public static bool JustInitialized()
{
return _bJustInitDone;
}
public static int GetInitResultCode()
{
return _nInitResultCode;
}
public static string GetInitResult()
{
return _sInitResult;
}
public static DeviceInfo GetDeviceInfo()
{
DeviceInfo info = (DeviceInfo)Marshal.PtrToStructure(DllGetDeviceInfo(), typeof(DeviceInfo)); ;
return info;
}
public static UserInfo GetUserInfo()
{
UserInfo info = (UserInfo)Marshal.PtrToStructure(DllGetUserInfo(), typeof(UserInfo));
return info;
}
public static bool IsGuest()
{
return DllIsGuest();
}
private static void onEventFromSDK(IntPtr sType, int nRetCode, IntPtr sRet, int nLen, IntPtr pUserData)
{
//string type = bytesToString(sType);
string type = Marshal.PtrToStringAnsi(sType);
string ret = "";
//ret = bytesToString(sRet, nLen);
ret = Marshal.PtrToStringAnsi(sRet, nLen);
Debug.Log("OVSDK.OnEventFromSDK(" + type + ", " + nRetCode + ",\n" + ret + ")");
if (type == "init")
{
_bInitDone = true;
_sInitResult = ret;
_nInitResultCode = nRetCode;
}
}
public static float GetOmniYawOffset()
{
return DllGetOmniYawOffset();
}
public static float GetOmniCoupleRate()
{
return DllGetOmniCoupleRate();
}
public static UInt32 GetUserOmniCoupleRate()
{
return DllGetUserOmniCoupleRate();
}
public static void SetOmniCoupleRate(float rate)
{
DllSetOmniCoupleRate(rate);
}
public static void SetOmniCoupleMode(bool useCoupleMode)
{
DllSetOmniCoupleMode(useCoupleMode);
}
//----------------------------------------------------------------------------------------------------------------------------------
// Omniverse.Functions.dll functions.
delegate void DllCallback(IntPtr sType, int nRetCode, IntPtr sRet, int nLen, IntPtr pUserData);
[DllImport("Omniverse.Functions")]
static extern bool DllInit(int nGameId, string sGameKey, string sParam, DllCallback cb, IntPtr pUserData);
[DllImport("Omniverse.Functions")]
static extern void DllShutdown();
[DllImport("Omniverse.Functions")]
public static extern bool DllLaunchGame(string exe, string workdir, string cmdline, int game_id, int prepare_time); //启动游戏,传入参数
[DllImport("Omniverse.Functions")]
static extern bool DllIsDevMode();
[DllImport("Omniverse.Functions")]
static extern void DllDrive();
[DllImport("Omniverse.Functions")]
static extern void DllSendCommand(int nCmd, string sData, int nLen);
[DllImport("Omniverse.Functions")]
static extern void DllBuy(string sItem, double nPrice, string sOutTradeNo);
[DllImport("Omniverse.Functions")]
static extern IntPtr DllGetDeviceInfo();
[DllImport("Omniverse.Functions")]
static extern IntPtr DllGetUserInfo();
[DllImport("Omniverse.Functions")]
static extern float DllGetOmniYawOffset();
[DllImport("Omniverse.Functions")]
static extern float DllGetOmniCoupleRate();
[DllImport("Omniverse.Functions")]
static extern UInt32 DllGetUserOmniCoupleRate();
[DllImport("Omniverse.Functions")]
static extern void DllSetOmniCoupleRate(float coupleRate);
[DllImport("Omniverse.Functions")]
static extern void DllSetOmniCoupleMode(bool useCoupleMode);
[DllImport("Omniverse.Functions")]
static extern bool DllIsGuest();
[DllImport("Omniverse.Functions")]
static extern void DllSaveGameData(IntPtr data, int len);
[DllImport("Omniverse.Functions")]
static extern void DllLoadGameData();
[DllImport("Omniverse.Functions")]
public static extern void DllTest(IntPtr param);
#if UNITY_EDITOR
[DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern int MessageBox(IntPtr handle, String message, String title, int type);
#endif
//----------------------------------------------------------------------------------------------------------------------------------
// internal utility functions.
void Start()
{
}
void Update()
{
DllDrive();
if (_bInitDone)
{
if (_bIniting)
{
_bIniting = false;
_bJustInitDone = true;
}
else if (_bJustInitDone)
{
_bJustInitDone = false;
}
}
}
void OnDestroy()
{
Debug.Log("OVSDK shutdown.");
DllShutdown();
}
}