rj-action-library/Runtime/Networking/Backends/LAN/LANNetworkingBackend.cs

174 lines
4.4 KiB
C#
Raw Normal View History

2025-01-08 18:46:17 +00:00
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
[GlobalClass]
public partial class LANNetworkBackend:NetworkBackend
{
SceneMultiplayer multiplayer;
ENetMultiplayerPeer peer;
public override void StartSession( NetworkSessionRequest request )
{
if ( _state != NetworkSessionConnectionState.Not_Connected )
{
return;
}
AssignSessionRequestVariables( request );
RJLog.Log( "Starting Session:", request );
_state = NetworkSessionConnectionState.Connecting_As_Server;
multiplayer = new SceneMultiplayer();
ConnectListeners();
peer = new ENetMultiplayerPeer();
var result = peer.CreateServer( port, maxMembers );
if ( Error.Ok != result )
{
_state = NetworkSessionConnectionState.Not_Connected;
RJLog.Log( "Session Creation Failed >>", result );
return;
}
_state = NetworkSessionConnectionState.Connected_As_Server;
_sessionManager.SetInSessionState();
Action.Trigger( _manager.onStartedSession );
AssignMultiplyer();
}
public override void JoinSession( NetworkSessionRequest request )
{
if ( _state != NetworkSessionConnectionState.Not_Connected )
{
if ( NetworkSessionConnectionState.Connected_As_Client == _state )
{
SendData();
}
return;
}
AssignSessionRequestVariables( request );
RJLog.Log( "Joining Session:", request );
_state = NetworkSessionConnectionState.Connecting_As_Client;
multiplayer = new SceneMultiplayer();
ConnectListeners();
peer = new ENetMultiplayerPeer();
var result = peer.CreateClient( serverIP, port, maxMembers );
if ( Error.Ok != result )
{
RJLog.Log( "Joining Session Failed >>", result );
_state = NetworkSessionConnectionState.Not_Connected;
return;
}
AssignMultiplyer();
}
void SendData()
{
var data = new byte[]{ 0, 1, 2, 3 };
var resultSending = multiplayer.SendBytes( data, 0, MultiplayerPeer.TransferModeEnum.Reliable );
RJLog.Log( "Sending Data", resultSending, ByteView.Stringify( data ) );
}
void AssignMultiplyer()
{
RJLog.Log( "AssignMultiplyer" );
multiplayer.MultiplayerPeer = peer;
GetTree().SetMultiplayer( multiplayer );
}
void ConnectListeners()
{
multiplayer.PeerPacket += ( id, data )=>
{
RJLog.Log( "Received Data:", id, ByteView.Stringify( data ) );
_transport.HandleIncomingMessage( id, data );
};
multiplayer.ConnectionFailed += ()=>
{
RJLog.Log( "ConnectionFailed" );
_state = NetworkSessionConnectionState.Not_Connected;
};
multiplayer.ServerDisconnected += ()=>
{
RJLog.Log( "ServerDisconnected" );
_state = NetworkSessionConnectionState.Not_Connected;
_sessionManager.SetInSessionState( false );
};
multiplayer.ConnectedToServer += ()=>
{
RJLog.Log( "Connecting_As_Client" );
_state = NetworkSessionConnectionState.Connected_As_Client;
_sessionManager.SetInSessionState();
Action.Trigger( _manager.onStartedSession );
};
multiplayer.PeerConnected += ( id )=>
{
RJLog.Log( "PeerConnected:", id );
var networkSessionMember = NetworkSessionMember.Create( id );
_sessionManager.AddMember( networkSessionMember );
};
multiplayer.PeerDisconnected += ( id )=>
{
RJLog.Log( "PeerDisconnected:", id );
_sessionManager.RemoveMember( id );
};
}
public override void SendMessage( byte[] bytes, List<int> targetMembers, bool reliable = true )
{
var mode = reliable ? MultiplayerPeer.TransferModeEnum.Reliable : MultiplayerPeer.TransferModeEnum.Unreliable;
if ( targetMembers.Count == 0 )
{
var resultSending = multiplayer.SendBytes( bytes, 0, mode );
RJLog.Log( "Sending Data", resultSending, ByteView.Stringify( bytes ) );
}
else
{
targetMembers.ForEach(
( id )=>
{
var resultSending = multiplayer.SendBytes( bytes, id, mode );
RJLog.Log( "Sending Data", resultSending, ByteView.Stringify( bytes ) );
}
);
}
}
}
}