194 lines
8.3 KiB
C#
194 lines
8.3 KiB
C#
|
|
/*******************************************************************************
|
|||
|
|
Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved.
|
|||
|
|
|
|||
|
|
NOTICE:All information contained herein is, and remains the property of
|
|||
|
|
PICO Technology Co., Ltd. The intellectual and technical concepts
|
|||
|
|
contained herein are proprietary to PICO Technology Co., Ltd. and may be
|
|||
|
|
covered by patents, patents in process, and are protected by trade secret or
|
|||
|
|
copyright law. Dissemination of this information or reproduction of this
|
|||
|
|
material is strictly forbidden unless prior written permission is obtained from
|
|||
|
|
PICO Technology Co., Ltd.
|
|||
|
|
*******************************************************************************/
|
|||
|
|
|
|||
|
|
using System;
|
|||
|
|
using System.Runtime.InteropServices;
|
|||
|
|
using Pico.Platform.Models;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace Pico.Platform
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* \ingroup Platform
|
|||
|
|
*/
|
|||
|
|
public static class NetworkService
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// Reads the messages from other users in the room.
|
|||
|
|
/// </summary>
|
|||
|
|
public static Packet ReadPacket()
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var handle = CLIB.ppf_Net_ReadPacket();
|
|||
|
|
if (handle == IntPtr.Zero)
|
|||
|
|
return null;
|
|||
|
|
return new Packet(handle);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Sends messages to a specified user. The maximum messaging frequency is 1000/s.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="userId">The ID of the user to send messages to.</param>
|
|||
|
|
/// <param name="bytes">The message length (in bytes). The maximum bytes allowed is 512.</param>
|
|||
|
|
/// <returns>
|
|||
|
|
/// * `true`: success
|
|||
|
|
/// * `false`: failure
|
|||
|
|
/// </returns>
|
|||
|
|
public static bool SendPacket(string userId, byte[] bytes)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (string.IsNullOrEmpty(userId))
|
|||
|
|
{
|
|||
|
|
Debug.LogError("User ID is null or empty!");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GCHandle hobj = GCHandle.Alloc(bytes, GCHandleType.Pinned);
|
|||
|
|
IntPtr pobj = hobj.AddrOfPinnedObject();
|
|||
|
|
var ok = CLIB.ppf_Net_SendPacket(userId, (UIntPtr) bytes.Length, pobj);
|
|||
|
|
if (hobj.IsAllocated)
|
|||
|
|
hobj.Free();
|
|||
|
|
return ok;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Sends messages to a specified user. The maximum messaging frequency is 1000/s.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="userId">The ID of the user to send messages to.</param>
|
|||
|
|
/// <param name="bytes">The message length (in bytes). The maximum bytes allowed is 512.</param>
|
|||
|
|
/// <param name="reliable">When `reliable` is set to `true`, messages between lost and resume will not be lost.
|
|||
|
|
/// The retention time is determined by the `reserve_period` parameter configured for the matchmaking pool, with a maximum of 1 minute.
|
|||
|
|
/// When `reliable` is set to `false`, this function works the same as the other `SendPacket` function.</param>
|
|||
|
|
/// <returns>
|
|||
|
|
/// * `true`: success
|
|||
|
|
/// * `false`: failure
|
|||
|
|
/// </returns>
|
|||
|
|
public static bool SendPacket(string userId, byte[] bytes, bool reliable)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (string.IsNullOrEmpty(userId))
|
|||
|
|
{
|
|||
|
|
Debug.LogError("User ID is null or empty!");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GCHandle hobj = GCHandle.Alloc(bytes, GCHandleType.Pinned);
|
|||
|
|
IntPtr pobj = hobj.AddrOfPinnedObject();
|
|||
|
|
var ok = CLIB.ppf_Net_SendPacket2(userId, (UIntPtr) bytes.Length, pobj, reliable);
|
|||
|
|
if (hobj.IsAllocated)
|
|||
|
|
{
|
|||
|
|
hobj.Free();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return ok;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Sends messages to other users in the room. The maximum messaging frequency is 1000/s.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="bytes">The message length (in bytes). The maximum bytes allowed is 512.</param>
|
|||
|
|
/// <returns>
|
|||
|
|
/// * `true`: success
|
|||
|
|
/// * `false`: failure
|
|||
|
|
/// </returns>
|
|||
|
|
public static bool SendPacketToCurrentRoom(byte[] bytes)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GCHandle hobj = GCHandle.Alloc(bytes, GCHandleType.Pinned);
|
|||
|
|
IntPtr pobj = hobj.AddrOfPinnedObject();
|
|||
|
|
var ok = CLIB.ppf_Net_SendPacketToCurrentRoom((UIntPtr) bytes.Length, pobj);
|
|||
|
|
if (hobj.IsAllocated)
|
|||
|
|
{
|
|||
|
|
hobj.Free();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return ok;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Sends messages to other users in the room. The maximum messaging frequency is 1000/s.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="bytes">The message length (in bytes). The maximum bytes allowed is 512.</param>
|
|||
|
|
/// <param name="reliable">When `reliable` is set to `true`, messages between lost and resume will not be lost.
|
|||
|
|
/// The retention time is determined by the `reserve_period` parameter configured for the matchmaking pool, with a maximum of 1 minute.
|
|||
|
|
/// When `reliable` is set to `false`, this function works the same as the other `SendPacketToCurrentRoom` function.</param>
|
|||
|
|
/// <returns>
|
|||
|
|
/// * `true`: success
|
|||
|
|
/// * `false`: failure
|
|||
|
|
/// </returns>
|
|||
|
|
public static bool SendPacketToCurrentRoom(byte[] bytes, bool reliable)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GCHandle hobj = GCHandle.Alloc(bytes, GCHandleType.Pinned);
|
|||
|
|
IntPtr pobj = hobj.AddrOfPinnedObject();
|
|||
|
|
var ok = CLIB.ppf_Net_SendPacketToCurrentRoom2((UIntPtr) bytes.Length, pobj, reliable);
|
|||
|
|
if (hobj.IsAllocated)
|
|||
|
|
hobj.Free();
|
|||
|
|
return ok;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void SetPlatformGameInitializeAsynchronousCallback(Message<GameInitializeResult>.Handler handler)
|
|||
|
|
{
|
|||
|
|
Looper.RegisterNotifyHandler(MessageType.PlatformGameInitializeAsynchronous, handler);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>Sets the callback to get notified when the game network fluctuates.
|
|||
|
|
/// Listen to this event to receive a relevant message. Use `Message.Data` to get the network situation in the game.</summary>
|
|||
|
|
///
|
|||
|
|
/// <param name="handler">Callback handler. The callback function will be called when receiving the `Notification_Game_ConnectionEvent` message and the value of `requestID` is `0`.</param>
|
|||
|
|
public static void SetNotification_Game_ConnectionEventCallback(Message<GameConnectionEvent>.Handler handler)
|
|||
|
|
{
|
|||
|
|
Looper.RegisterNotifyHandler(MessageType.Notification_Game_ConnectionEvent, handler);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void SetNotification_Game_Request_FailedCallback(Message<GameRequestFailedReason>.Handler handler)
|
|||
|
|
{
|
|||
|
|
Looper.RegisterNotifyHandler(MessageType.Notification_Game_RequestFailed, handler);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>Sets the callback to get notified when the game state needs to be reset.
|
|||
|
|
/// Listen to this event to receive a relevant message. If you receive this message, you will need to reset your gaming state. For example,
|
|||
|
|
/// * If you are in a room before receiving this message, you will need to check and reset your room state after receving this message.
|
|||
|
|
/// * If you are in a matchmaking queue before receiving this message, you will need to check and reset your matchmaking state after receiving this message.</summary>
|
|||
|
|
///
|
|||
|
|
/// <param name="handler">Callback handler. The callback function will be called when receiving the "Notification_Game_StateReset" message and the value of `requestID` is `0`.</param>
|
|||
|
|
public static void SetNotification_Game_StateResetCallback(Message.Handler handler)
|
|||
|
|
{
|
|||
|
|
Looper.RegisterNotifyHandler(MessageType.Notification_Game_StateReset, handler);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|