光子螺栓 |创建后将房间设为私有
Photon Bolt | Make room private after creation
我知道如何私下玩游戏。
BoltLauncher.StartSinglePlayer
但是这次不是离线玩游戏,我想知道的是如何将房间设为私有,这样就没有更多的玩家可以加入了。
我将 IsOpen
设置为 false 并在玩家需要时将其保密,但其他客户可以加入房间。
有谁知道当服务器所有者想要时如何设置私有?
将接受模式设置为手动。
覆盖 ConnectRequest
以检查您必须跟踪的任何变量是否会话应该是私有的,如果它应该是私有的,或者如果连接应该被允许,则调用 BoltNetwork.Refuse
,BoltNetwork.Accept
:
private bool serverShouldBePrivateNow;
// ...
public override void ConnectRequest(UdpEndPoint endpoint, Bolt.IProtocolToken token) {
bool connectionShouldBeRejected = false;
connectionShouldBeRejected = connectionShouldBeRejected || serverShouldBePrivateNow;
// any other appropriate checks go here
// connectionShouldBeRejected = connectionShouldBeRejected || ...;
// connectionShouldBeRejected = connectionShouldBeRejected || ...;
// connectionShouldBeRejected = connectionShouldBeRejected || ...;
if (connectionShouldBeRejected)
{
BoltNetwork.Refuse(endpoint);
}
else
{
BoltNetwork.Accept(endpoint);
}
}
如果您需要 return 向客户端发送数据(例如连接被拒绝的确切原因的解释),您可以使用 BoltNetwork.Refuse(UdpEndPoint endpoint, IProtocolToken refuseToken);
:
以令牌响应
- 定义一个
IProtocolToken
:
using UdpKit;
public class RequestToken : Bolt.IProtocolToken
{
public enum RefuseReason {privateReason1, privateReason2}
// other reasons go here
public RefuseReason reason { get; set; }
public void Read(UdpPacket packet)
{
this.reason = (RefuseReason)packet.ReadInt();
}
public void Write(UdpPacket packet)
{
packet.WriteInt((int)this.reason);
}
}
- 在
ConnectRequest
中的服务器代码上使用它:
public override void ConnectRequest(UdpEndPoint endpoint, Bolt.IProtocolToken token) {
bool connectionShouldBeRejected = false;
connectionShouldBeRejected = connectionShouldBeRejected || serverShouldBePrivateNow;
if (connectionShouldBeRejected)
{
RequestToken token = new RequestToken();
if (serverShouldBePrivateNow)
{
token.reason = RequestToken.RefuseReason.privateReason1;
}
else
{
token.reason = RequestToken.RefuseReason.privateReason2;
}
BoltNetwork.Refuse(endpoint, token);
}
else
{
BoltNetwork.Accept(endpoint);
}
}
- 在
void ConnectRefused(UdpEndPoint endpoint, Bolt.IProtocolToken token)
中的客户端代码中查看:
public override void ConnectRefused(UdpEndpoint endpoint, Bolt.IProtocolToken token)
{
Debug.Assert(token is RequestToken);
RequestToken reqTok = (RequestToken)token;
switch (token.reason)
{
case RequestToken.RefuseReason.privateReason1:
// handle private Reason 1
break;
case RequestToken.RefuseReason.privateReason2:
// handle private Reason 2
break;
default:
// handle error in packet
Debug.Assert(false, "Undefined value for enum");
}
}
有关详细信息,请参阅 Accepting and Refusing Connections on the Bolt wiki
我知道如何私下玩游戏。
BoltLauncher.StartSinglePlayer
但是这次不是离线玩游戏,我想知道的是如何将房间设为私有,这样就没有更多的玩家可以加入了。
我将 IsOpen
设置为 false 并在玩家需要时将其保密,但其他客户可以加入房间。
有谁知道当服务器所有者想要时如何设置私有?
将接受模式设置为手动。
覆盖 ConnectRequest
以检查您必须跟踪的任何变量是否会话应该是私有的,如果它应该是私有的,或者如果连接应该被允许,则调用 BoltNetwork.Refuse
,BoltNetwork.Accept
:
private bool serverShouldBePrivateNow;
// ...
public override void ConnectRequest(UdpEndPoint endpoint, Bolt.IProtocolToken token) {
bool connectionShouldBeRejected = false;
connectionShouldBeRejected = connectionShouldBeRejected || serverShouldBePrivateNow;
// any other appropriate checks go here
// connectionShouldBeRejected = connectionShouldBeRejected || ...;
// connectionShouldBeRejected = connectionShouldBeRejected || ...;
// connectionShouldBeRejected = connectionShouldBeRejected || ...;
if (connectionShouldBeRejected)
{
BoltNetwork.Refuse(endpoint);
}
else
{
BoltNetwork.Accept(endpoint);
}
}
如果您需要 return 向客户端发送数据(例如连接被拒绝的确切原因的解释),您可以使用 BoltNetwork.Refuse(UdpEndPoint endpoint, IProtocolToken refuseToken);
:
- 定义一个
IProtocolToken
:
using UdpKit;
public class RequestToken : Bolt.IProtocolToken
{
public enum RefuseReason {privateReason1, privateReason2}
// other reasons go here
public RefuseReason reason { get; set; }
public void Read(UdpPacket packet)
{
this.reason = (RefuseReason)packet.ReadInt();
}
public void Write(UdpPacket packet)
{
packet.WriteInt((int)this.reason);
}
}
- 在
ConnectRequest
中的服务器代码上使用它:
public override void ConnectRequest(UdpEndPoint endpoint, Bolt.IProtocolToken token) {
bool connectionShouldBeRejected = false;
connectionShouldBeRejected = connectionShouldBeRejected || serverShouldBePrivateNow;
if (connectionShouldBeRejected)
{
RequestToken token = new RequestToken();
if (serverShouldBePrivateNow)
{
token.reason = RequestToken.RefuseReason.privateReason1;
}
else
{
token.reason = RequestToken.RefuseReason.privateReason2;
}
BoltNetwork.Refuse(endpoint, token);
}
else
{
BoltNetwork.Accept(endpoint);
}
}
- 在
void ConnectRefused(UdpEndPoint endpoint, Bolt.IProtocolToken token)
中的客户端代码中查看:
public override void ConnectRefused(UdpEndpoint endpoint, Bolt.IProtocolToken token)
{
Debug.Assert(token is RequestToken);
RequestToken reqTok = (RequestToken)token;
switch (token.reason)
{
case RequestToken.RefuseReason.privateReason1:
// handle private Reason 1
break;
case RequestToken.RefuseReason.privateReason2:
// handle private Reason 2
break;
default:
// handle error in packet
Debug.Assert(false, "Undefined value for enum");
}
}
有关详细信息,请参阅 Accepting and Refusing Connections on the Bolt wiki