4jcraft/Minecraft.Client/Platform/Common/Network/Sony/SQRNetworkPlayer.h
2026-03-22 04:16:54 -05:00

141 lines
5.7 KiB
C++

#pragma once
#include "SQRNetworkManager.h"
#include <queue>
// This is the lowest level class for handling the concept of a player on Sony
// platforms. This is managed by SQRNetworkManager. The game shouldn't directly
// communicate with this class, as it is wrapped by NetworkPlayerSony which is
// an implementation of a platform-independent interface INetworkPlayer.
class SQRNetworkPlayer {
#ifdef __ORBIS__
friend class SQRNetworkManager_Orbis;
friend class SonyVoiceChat_Orbis;
#elif defined __PS3__
friend class SQRNetworkManager_PS3;
#else // __PSVITA__
friend class SQRNetworkManager_Vita;
friend class SQRNetworkManager_AdHoc_Vita;
friend class SonyVoiceChat_Vita;
#endif
friend class SQRNetworkManager;
friend class NetworkPlayerSony;
friend class CPlatformNetworkManagerSony;
int GetSmallId();
wchar_t* GetName();
bool IsRemote();
bool IsHost();
bool IsLocal();
int GetLocalPlayerIndex();
bool IsSameSystem(SQRNetworkPlayer* other);
uintptr_t GetCustomDataValue();
void SetCustomDataValue(uintptr_t data);
bool HasVoice();
bool IsTalking();
bool IsMutedByLocalUser(int userIndex);
static const int SNP_FLAG_CONNECTION_COMPLETE =
1; // This player has a fully connected Rudp or other local link
// established (to a remote player if this is on the host, to the
// host if this is a client) - or isn't expected to have one
static const int SNP_FLAG_SMALLID_ALLOCATED =
2; // This player has a small id allocated
static const int SNP_FLAG_SMALLID_CONFIRMED =
4; // This player's small id has been confirmed as received by the
// client (only relevant for players using network communications,
// others set at the same time as allocating)
static const int SNP_FLAG_READY_MASK =
7; // Mask indicated all bits which must be set in the flags for this
// player to be considered "ready"
static const int SNP_MAX_PAYLOAD =
1346; // This is the default RUDP payload size - if we want to change
// this we'll need to use cellRudpSetOption to set something else
// & adjust segment size
typedef enum {
SNP_TYPE_HOST, // This player represents the host
SNP_TYPE_LOCAL, // On host - this player is a local player that needs
// communicated with specially not using rudp. On
// clients - this is a local player, where m_rudpCtx is
// the context used to communicate from this player
// to/from the host
SNP_TYPE_REMOTE, // On host - this player's m_rupdCtx can be used to
// communicate from between the host and this player.
// On clients - this is a remote player that cannot be
// communicated with
} eSQRNetworkPlayerType;
class QueuedSendBlock {
public:
unsigned char* start;
unsigned char* end;
unsigned char* current;
};
class InitSendData {
public:
unsigned char
m_smallId; // Id to uniquely and permanently identify this player
// between machines - assigned by the server
PlayerUID m_UID;
};
SQRNetworkPlayer(SQRNetworkManager* manager,
eSQRNetworkPlayerType playerType, bool onHost,
SceNpMatching2RoomMemberId roomMemberId,
int localPlayerIdx, int rudpCtx, PlayerUID* pUID);
~SQRNetworkPlayer();
PlayerUID GetUID();
void SetUID(PlayerUID UID);
bool HasConnectionAndSmallId();
bool IsReady();
void ConnectionComplete();
void SmallIdAllocated(unsigned char smallId);
void InitialDataReceived(
InitSendData*
ISD); // Only for remote players as viewed from the host, this is
// set when the host has received confirmation that the
// client has received the small id for this player, ie it is
// now safe to send data to
bool HasSmallIdConfirmed();
void SendData(SQRNetworkPlayer* pPlayerTarget, const void* data,
unsigned int dataSize);
void ConfirmReady();
void SendInternal(const void* data, unsigned int dataSize);
void SendMoreInternal();
#ifdef __PSVITA__
void SendInternal_VitaAdhoc(const void* data, unsigned int dataSize,
EAdhocDataTag tag = e_dataTag_Normal);
void SendMoreInternal_VitaAdhoc();
#endif
void SetNameFromUID();
void SetName(char* name);
int GetSessionIndex();
eSQRNetworkPlayerType m_type; // The player type
bool m_host; // Whether this actual player class is stored on a host (not
// whether it represents the host, or a player on the host
// machine)
int m_flags; // Flags reflecting current state of this player
int m_rudpCtx; // Rudp context that can be used to communicate between this
// player & the host (see comments for eSQRNetworkPlayerType
// above)
int m_localPlayerIdx; // Index of this player on the machine to which it
// belongs
SceNpMatching2RoomMemberId
m_roomMemberId; // The room member id, effectively a per machine id
InitSendData m_ISD; // Player UID & ID that get sent together to the host
// when connection is established
SQRNetworkManager*
m_manager; // Pointer back to the manager that is managing this player
wchar_t m_name[21];
uintptr_t m_customData;
CRITICAL_SECTION m_csQueue;
std::queue<QueuedSendBlock> m_sendQueue;
};