Server list, lighting/los optimization

This commit is contained in:
Regalis
2015-08-07 23:10:12 +03:00
parent 08c5117e8f
commit 0937c30f15
45 changed files with 36611 additions and 41 deletions

View File

@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using Lidgren.Network;
using Microsoft.Xna.Framework;
using RestSharp;
namespace Subsurface.Networking
{
@@ -18,6 +19,11 @@ namespace Subsurface.Networking
private TimeSpan SparseUpdateInterval = new TimeSpan(0, 0, 0, 1);
private DateTime sparseUpdateTimer;
private TimeSpan refreshMasterInterval = new TimeSpan(0, 0, 40);
private DateTime refreshMasterTimer;
private bool registeredToMaster;
private Client myClient;
public GameServer(string name, int port)
@@ -33,6 +39,7 @@ namespace Subsurface.Networking
//config.SimulatedMinimumLatency = 0.25f;
config.Port = port;
Port = port;
config.EnableUPnP = true;
@@ -44,7 +51,7 @@ namespace Subsurface.Networking
{
server = new NetServer(config);
server.Start();
// attempt to forward port
server.UPnP.ForwardPort(port, "subsurface");
@@ -55,12 +62,69 @@ namespace Subsurface.Networking
DebugConsole.ThrowError("Couldn't start the server", e);
}
RegisterToMasterServer();
updateInterval = new TimeSpan(0, 0, 0, 0, 30);
DebugConsole.NewMessage("Server started", Color.Green);
}
private void RegisterToMasterServer()
{
var client = new RestClient(NetworkMember.MasterServerUrl);
var request = new RestRequest("masterserver.php", Method.GET);
request.AddParameter("action", "addserver");
request.AddParameter("servername", name);
request.AddParameter("serverport", Port);
request.AddParameter("playercount", PlayerCountToByte(connectedClients.Count, config.MaximumConnections));
// execute the request
RestResponse response = (RestResponse)client.Execute(request);
if (response.StatusCode != System.Net.HttpStatusCode.OK)
{
DebugConsole.ThrowError("Error while connecting to master server (" +response.StatusCode+": "+response.StatusDescription+")");
return;
}
if (response!=null && !string.IsNullOrWhiteSpace(response.Content))
{
DebugConsole.ThrowError("Error while connecting to master server (" +response.Content+")");
return;
}
registeredToMaster = true;
refreshMasterTimer = DateTime.Now + refreshMasterInterval;
}
private void RefreshMaster()
{
var client = new RestClient(NetworkMember.MasterServerUrl);
var request = new RestRequest("masterserver.php", Method.GET);
request.AddParameter("action", "refreshserver");
request.AddParameter("gamestarted", gameStarted ? 1 : 0);
request.AddParameter("playercount", PlayerCountToByte(connectedClients.Count, config.MaximumConnections));
System.Diagnostics.Debug.WriteLine("refreshing master");
var sw = new Stopwatch();
sw.Start();
RestResponse response = (RestResponse)client.Execute(request);
sw.Stop();
System.Diagnostics.Debug.WriteLine("took "+sw.ElapsedMilliseconds+" ms");
if (response.StatusCode != System.Net.HttpStatusCode.OK)
{
DebugConsole.ThrowError("Error while connecting to master server (" +response.StatusCode+": "+response.StatusDescription+")");
}
}
public override void Update(float deltaTime)
{
base.Update(deltaTime);
@@ -92,6 +156,13 @@ namespace Subsurface.Networking
updateTimer = DateTime.Now + updateInterval;
}
if (registeredToMaster && refreshMasterTimer < DateTime.Now)
{
RefreshMaster();
refreshMasterTimer = DateTime.Now + refreshMasterInterval;
}
}
private void SparseUpdate()
@@ -724,6 +795,16 @@ namespace Subsurface.Networking
return preferredClient;
}
private byte PlayerCountToByte(int playerCount, int maxPlayers)
{
byte byteVal = (byte)playerCount;
byteVal |= (byte)((maxPlayers-1) << 4);
return byteVal;
}
/// <summary>
/// sends some random data to the clients
/// use for debugging purposes

View File

@@ -33,6 +33,8 @@ namespace Subsurface.Networking
{
public const int DefaultPort = 14242;
public static string MasterServerUrl = Game1.Config.MasterServerUrl;
protected static Color[] messageColor = { Color.White, Color.Red, Color.LightBlue, Color.LightGreen };
protected string name;
@@ -224,6 +226,15 @@ namespace Subsurface.Networking
public virtual void Disconnect() { }
public static int ByteToPlayerCount(byte byteVal, out int maxPlayers)
{
maxPlayers = (byteVal >> 4)+1;
int playerCount = byteVal & (byte)((1 << 4) - 1);
return playerCount;
}
}
enum ChatMessageType