Build 0.18.4.0
This commit is contained in:
+71
-21
@@ -12,19 +12,60 @@ namespace Barotrauma
|
||||
{
|
||||
public const int MinimumInitialMoney = 500;
|
||||
|
||||
private UInt16 lastUpdateID;
|
||||
public UInt16 LastUpdateID
|
||||
[Flags]
|
||||
public enum NetFlags : UInt16
|
||||
{
|
||||
get
|
||||
{
|
||||
#if SERVER
|
||||
if (GameMain.Server != null && lastUpdateID < 1) { lastUpdateID++; }
|
||||
#endif
|
||||
return lastUpdateID;
|
||||
}
|
||||
set { lastUpdateID = value; }
|
||||
Misc = 0x1,
|
||||
MapAndMissions = 0x2,
|
||||
UpgradeManager = 0x4,
|
||||
SubList = 0x8,
|
||||
ItemsInBuyCrate = 0x10,
|
||||
ItemsInSellFromSubCrate = 0x20,
|
||||
PurchasedItems = 0x80,
|
||||
SoldItems = 0x100,
|
||||
Reputation = 0x200,
|
||||
CharacterInfo = 0x800
|
||||
}
|
||||
|
||||
private readonly Dictionary<NetFlags, UInt16> lastUpdateID;
|
||||
|
||||
public UInt16 GetLastUpdateIdForFlag(NetFlags flag)
|
||||
{
|
||||
if (!ValidateFlag(flag)) { return 0; }
|
||||
return lastUpdateID[flag];
|
||||
}
|
||||
public void SetLastUpdateIdForFlag(NetFlags flag, UInt16 id)
|
||||
{
|
||||
if (!ValidateFlag(flag)) { return; }
|
||||
lastUpdateID[flag] = id;
|
||||
}
|
||||
|
||||
public void IncrementLastUpdateIdForFlag(NetFlags flag)
|
||||
{
|
||||
if (!ValidateFlag(flag)) { return; }
|
||||
if (!lastUpdateID.ContainsKey(flag)) { lastUpdateID[flag] = 0; }
|
||||
lastUpdateID[flag]++;
|
||||
}
|
||||
public void IncrementAllLastUpdateIds()
|
||||
{
|
||||
foreach (NetFlags flag in Enum.GetValues(typeof(NetFlags)))
|
||||
{
|
||||
if (!lastUpdateID.ContainsKey(flag)) { lastUpdateID[flag] = 0; }
|
||||
lastUpdateID[flag]++;
|
||||
}
|
||||
}
|
||||
|
||||
private bool ValidateFlag(NetFlags flag)
|
||||
{
|
||||
if (MathHelper.IsPowerOfTwo((int)flag)) { return true; }
|
||||
#if DEBUG
|
||||
throw new InvalidOperationException($"\"{flag}\" is not a valid campaign update flag.");
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
private UInt16 lastSaveID;
|
||||
public UInt16 LastSaveID
|
||||
{
|
||||
@@ -35,11 +76,11 @@ namespace Barotrauma
|
||||
#endif
|
||||
return lastSaveID;
|
||||
}
|
||||
set
|
||||
set
|
||||
{
|
||||
#if SERVER
|
||||
//trigger a campaign update to notify the clients of the changed save ID
|
||||
lastUpdateID++;
|
||||
IncrementLastUpdateIdForFlag(NetFlags.Misc);
|
||||
#endif
|
||||
lastSaveID = value;
|
||||
}
|
||||
@@ -52,23 +93,33 @@ namespace Barotrauma
|
||||
get; set;
|
||||
}
|
||||
|
||||
private MultiPlayerCampaign() : base(GameModePreset.MultiPlayerCampaign)
|
||||
private MultiPlayerCampaign(CampaignSettings settings) : base(GameModePreset.MultiPlayerCampaign, settings)
|
||||
{
|
||||
currentCampaignID++;
|
||||
lastUpdateID = new Dictionary<NetFlags, ushort>();
|
||||
foreach (NetFlags flag in Enum.GetValues(typeof(NetFlags)))
|
||||
{
|
||||
#if SERVER
|
||||
//server starts from a higher ID to ensure we send the initial state
|
||||
lastUpdateID[flag] = 1;
|
||||
#else
|
||||
lastUpdateID[flag] = 0;
|
||||
#endif
|
||||
}
|
||||
CampaignID = currentCampaignID;
|
||||
CampaignMetadata = new CampaignMetadata(this);
|
||||
UpgradeManager = new UpgradeManager(this);
|
||||
InitCampaignData();
|
||||
}
|
||||
|
||||
public static MultiPlayerCampaign StartNew(string mapSeed, SubmarineInfo selectedSub, CampaignSettings settings)
|
||||
public static MultiPlayerCampaign StartNew(string mapSeed, CampaignSettings settings)
|
||||
{
|
||||
MultiPlayerCampaign campaign = new MultiPlayerCampaign();
|
||||
MultiPlayerCampaign campaign = new MultiPlayerCampaign(settings);
|
||||
//only the server generates the map, the clients load it from a save file
|
||||
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer)
|
||||
{
|
||||
campaign.map = new Map(campaign, mapSeed, settings);
|
||||
campaign.Settings = settings;
|
||||
campaign.map = new Map(campaign, mapSeed);
|
||||
}
|
||||
campaign.InitProjSpecific();
|
||||
return campaign;
|
||||
@@ -76,7 +127,7 @@ namespace Barotrauma
|
||||
|
||||
public static MultiPlayerCampaign LoadNew(XElement element)
|
||||
{
|
||||
MultiPlayerCampaign campaign = new MultiPlayerCampaign();
|
||||
MultiPlayerCampaign campaign = new MultiPlayerCampaign(CampaignSettings.Empty);
|
||||
campaign.Load(element);
|
||||
campaign.InitProjSpecific();
|
||||
campaign.IsFirstRound = false;
|
||||
@@ -124,18 +175,17 @@ namespace Barotrauma
|
||||
{
|
||||
switch (subElement.Name.ToString().ToLowerInvariant())
|
||||
{
|
||||
case "campaignsettings":
|
||||
case CampaignSettings.LowerCaseSaveElementName:
|
||||
Settings = new CampaignSettings(subElement);
|
||||
#if CLIENT
|
||||
GameMain.NetworkMember.ServerSettings.MaxMissionCount = Settings.MaxMissionCount;
|
||||
GameMain.NetworkMember.ServerSettings.RadiationEnabled = Settings.RadiationEnabled;
|
||||
GameMain.NetworkMember.ServerSettings.CampaignSettings = Settings;
|
||||
#endif
|
||||
break;
|
||||
case "map":
|
||||
if (map == null)
|
||||
{
|
||||
//map not created yet, loading this campaign for the first time
|
||||
map = Map.Load(this, subElement, Settings);
|
||||
map = Map.Load(this, subElement);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user