Skip to content

Commit

Permalink
Merge pull request #663 from godarklight/issue-126
Browse files Browse the repository at this point in the history
Implement issue #126 (Server progress in %), Slight fix to handling the time skew message.
  • Loading branch information
TehGimp committed Mar 11, 2014
2 parents 0150d32 + bea9563 commit 79bde83
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 11 deletions.
7 changes: 4 additions & 3 deletions KMPClientMain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -841,10 +841,11 @@ static void handleMessage(KMPCommon.ServerMessageID id, byte[] data)
{
String server_version = encoder.GetString(data, 8, server_version_length);
clientID = KMPCommon.intFromBytes(data, 8 + server_version_length);
gameManager.gameMode = KMPCommon.intFromBytes(data, 12 + server_version_length);
int kmpModControl_length = KMPCommon.intFromBytes(data, 16 + server_version_length);
gameManager.gameMode = KMPCommon.intFromBytes(data, 12 + server_version_length);
gameManager.numberOfShips = KMPCommon.intFromBytes(data, 16 + server_version_length);
int kmpModControl_length = KMPCommon.intFromBytes(data, 20 + server_version_length);
kmpModControl_bytes = new byte[kmpModControl_length];
Array.Copy(data, 20 + server_version_length, kmpModControl_bytes, 0, kmpModControl_length);
Array.Copy(data, 24 + server_version_length, kmpModControl_bytes, 0, kmpModControl_length);
SetMessage("Handshake received. Server version: " + server_version);
}
}
Expand Down
24 changes: 22 additions & 2 deletions KMPManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ public struct VesselStatusInfo

public static object interopInQueueLock = new object();

public int numberOfShips = 0;
public int gameMode = 0; //0=Sandbox, 1=Career
public bool gameCheatsEnabled = false; //Allow built-in KSP cheats
public bool gameArrr = false; //Allow private vessels to be taken if other user can successfully dock manually
Expand Down Expand Up @@ -183,6 +184,7 @@ public struct VesselStatusInfo
private const int SYNC_TIME_VALID_COUNT = 4; //Number of SYNC_TIME's to receive until time is valid.
private const int MAX_TIME_SYNC_HISTORY = 10; //The last 10 SYNC_TIME's are used for the offset filter.
private ScreenMessage skewMessage;
private ScreenMessage vesselLoadedMessage;

private Queue<KMPVesselUpdate> vesselUpdateQueue = new Queue<KMPVesselUpdate>();
private Queue<KMPVesselUpdate> newVesselUpdateQueue = new Queue<KMPVesselUpdate>();
Expand Down Expand Up @@ -258,6 +260,7 @@ public struct VesselStatusInfo
private Vessel lastEVAVessel = null;
private bool showServerSync = false;
private bool inGameSyncing = false;
private List<Guid> vesselUpdatesLoaded = new List<Guid>();

private bool configRead = false;

Expand Down Expand Up @@ -359,7 +362,16 @@ public void updateStep()
if (syncing)
{
ScreenMessages.PostScreenMessage("Synchronizing universe, please wait...",1f,ScreenMessageStyle.UPPER_CENTER);
ScreenMessages.PostScreenMessage("Loaded vessels: " + FlightGlobals.Vessels.Count,0.04f,ScreenMessageStyle.UPPER_RIGHT);
if (vesselLoadedMessage != null) {
vesselLoadedMessage.duration = 0f;
}
if (!inGameSyncing) {
if (numberOfShips != 0) {
vesselLoadedMessage = ScreenMessages.PostScreenMessage("Loaded vessels: " + vesselUpdatesLoaded.Count + "/" + numberOfShips + " (" + (vesselUpdatesLoaded.Count * 100 / numberOfShips) + "%)",1f,ScreenMessageStyle.UPPER_RIGHT);
}
} else {
vesselLoadedMessage = ScreenMessages.PostScreenMessage("Loaded vessels: " + FlightGlobals.Vessels.Count,1f,ScreenMessageStyle.UPPER_RIGHT);
}
}

if (!isInFlight && HighLogic.LoadedScene == GameScenes.TRACKSTATION)
Expand Down Expand Up @@ -2668,6 +2680,10 @@ private void addRemoteVessel(ProtoVessel protovessel, Guid vessel_id, KMPVessel
if (protovessel.vesselType == VesselType.Flag) {
Invoke("ClearFlagLock", 5f);
}
if (!vesselUpdatesLoaded.Contains(vessel_id))
{
vesselUpdatesLoaded.Add(vessel_id);
}
Vector3 newWorldPos = Vector3.zero, newOrbitVel = Vector3.zero;
bool setTarget = false, wasLoaded = false, wasActive = false;
Vessel oldVessel = null;
Expand Down Expand Up @@ -3547,6 +3563,9 @@ private void SkewTime ()
double currentErrorMs = Math.Round (currentError * 1000, 2);

if (Math.Abs (currentError) > 5) {
if (skewMessage != null) {
skewMessage.duration = 0f;
}
if (isInFlight) {
krakensBaneWarp(skewTargetTick + timeFromLastSyncSecondsAdjusted);
} else {
Expand Down Expand Up @@ -4447,7 +4466,8 @@ private void connectionWindow(int windowID)
HighLogic.CurrentGame.Title = "KMP";
HighLogic.CurrentGame.Description = "Kerbal Multi Player session";
HighLogic.CurrentGame.flagURL = "KMP/Flags/default";

vesselUpdatesLoaded.Clear();

if (gameMode == 1) //Career mode
HighLogic.CurrentGame.Mode = Game.Modes.CAREER;

Expand Down
44 changes: 38 additions & 6 deletions KMPServer/Server.cs
Original file line number Diff line number Diff line change
Expand Up @@ -885,6 +885,35 @@ private void countShipsServerCommand(bool bList = false)

}

private int countShipsInDatabase()
{
var universeDB = KMPServer.Server.universeDB;
if (settings.useMySQL) {
universeDB = new MySqlConnection(settings.mySQLConnString);
universeDB.Open();
}
DbCommand cmd = universeDB.CreateCommand();
String sql = "SELECT vu.UpdateMessage, v.ProtoVessel, v.Guid" +
" FROM kmpVesselUpdate vu" +
" INNER JOIN kmpVessel v ON v.Guid = vu.Guid AND v.Destroyed != 1" +
" INNER JOIN kmpSubspace s ON s.ID = vu.Subspace" +
" INNER JOIN" +
" (SELECT vu.Guid, MAX(s.LastTick) AS LastTick" +
" FROM kmpVesselUpdate vu" +
" INNER JOIN kmpSubspace s ON s.ID = vu.Subspace" +
" GROUP BY vu.Guid) t ON t.Guid = vu.Guid AND t.LastTick = s.LastTick;";
cmd.CommandText = sql;
DbDataReader reader = cmd.ExecuteReader();
int count = 0;
while (reader.Read())
{
count++;
}
reader.Dispose();
if (settings.useMySQL) universeDB.Close();
return count;
}

private void listShipsServerCommand()
{
countShipsServerCommand(true);
Expand Down Expand Up @@ -2934,7 +2963,7 @@ private void sendHandshakeMessage(Client cl)

byte[] version_bytes = encoder.GetBytes(KMPCommon.PROGRAM_VERSION);

byte[] data_bytes = new byte[version_bytes.Length + 20 + kmpModControl.Length + 1];
byte[] data_bytes = new byte[version_bytes.Length + 24 + kmpModControl.Length + 1];

//Write net protocol version
KMPCommon.intToBytes(KMPCommon.NET_PROTOCOL_VERSION).CopyTo(data_bytes, 0);
Expand All @@ -2947,12 +2976,15 @@ private void sendHandshakeMessage(Client cl)

//Write client ID
KMPCommon.intToBytes(cl.clientIndex).CopyTo(data_bytes, 8 + version_bytes.Length);
//Write gameMode

//Write gameMode
KMPCommon.intToBytes(settings.gameMode).CopyTo(data_bytes, 12 + version_bytes.Length);

KMPCommon.intToBytes(kmpModControl.Length).CopyTo(data_bytes, 16 + version_bytes.Length);
kmpModControl.CopyTo(data_bytes, 20 + version_bytes.Length);

//Write number of ships in initial sync
KMPCommon.intToBytes(countShipsInDatabase()).CopyTo(data_bytes, 16 + version_bytes.Length);

KMPCommon.intToBytes(kmpModControl.Length).CopyTo(data_bytes, 20 + version_bytes.Length);
kmpModControl.CopyTo(data_bytes, 24 + version_bytes.Length);

cl.queueOutgoingMessage(KMPCommon.ServerMessageID.HANDSHAKE, data_bytes);
}
Expand Down

0 comments on commit 79bde83

Please sign in to comment.