| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- /*******************************************************************************
- 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);
- }
- }
- }
|