- Modified item buying logic: selected items are purchased immediately without having to click the "buy" button, and they stay in the list of purchased items until the round is started. (-> It's possible to see which items have been purchased and cancel purchases).

- Clients can be given a permission to manage the campaign (atm selecting which location to head towards and buying items).
- Syncing cargomanager state with clients.
- Misc fixes.
This commit is contained in:
Joonas Rikkonen
2017-09-17 15:55:24 +03:00
parent b292a301cf
commit 9114ae658f
13 changed files with 271 additions and 151 deletions

View File

@@ -1,7 +1,5 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Xml.Linq;
namespace Barotrauma
{

View File

@@ -29,7 +29,7 @@ namespace Barotrauma
bool gameOver = gameSession.CrewManager.characters.All(c => c.IsDead);
bool progress = Submarine.MainSub.AtEndPosition;
GUIFrame frame = new GUIFrame(new Rectangle(0, 0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), Color.Black * 0.8f);
GUIFrame frame = new GUIFrame(new Rectangle(0, 0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), Color.Black * 0.8f, null);
int width = 760, height = 400;
GUIFrame innerFrame = new GUIFrame(new Rectangle(0, 0, width, height), null, Alignment.Center, "", frame);

View File

@@ -44,9 +44,13 @@ namespace Barotrauma
{
selectedConnection = connection;
selectedLocation = highlightedLocation;
OnLocationSelected?.Invoke(selectedLocation, selectedConnection);
//GameMain.LobbyScreen.SelectLocation(highlightedLocation, connection);
//clients aren't allowed to select the location without a permission
if (GameMain.Client == null || GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign))
{
OnLocationSelected?.Invoke(selectedLocation, selectedConnection);
GameMain.Client?.SendCampaignState();
}
}
}
@@ -54,6 +58,7 @@ namespace Barotrauma
if (PlayerInput.DoubleClicked() && highlightedLocation != null)
{
currentLocation = highlightedLocation;
OnLocationChanged?.Invoke(currentLocation);
}
#endif
}

View File

@@ -1312,6 +1312,24 @@ namespace Barotrauma.Networking
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
}
public void SendCampaignState()
{
MultiplayerCampaign campaign = GameMain.GameSession.GameMode as MultiplayerCampaign;
if (campaign == null)
{
DebugConsole.ThrowError("Failed send campaign state to the server (no campaign active).\n" + Environment.StackTrace);
return;
}
NetOutgoingMessage msg = client.CreateMessage();
msg.Write((byte)ClientPacketHeader.SERVER_COMMAND);
msg.Write((byte)ClientPermissions.ManageCampaign);
campaign.ClientWrite(msg);
msg.Write((byte)ServerNetObject.END_OF_MESSAGE);
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
}
public void RequestRoundEnd()
{
NetOutgoingMessage msg = client.CreateMessage();

View File

@@ -24,10 +24,8 @@ namespace Barotrauma
private CampaignMode campaign;
private GUIFrame previewFrame;
private GUIButton buyButton;
private GUIFrame characterPreviewFrame;
private Level selectedLevel;
private float mapZoom = 3.0f;
@@ -44,27 +42,7 @@ namespace Barotrauma
{
get { return campaign; }
}
private string CostTextGetter()
{
return "Cost: " + selectedItemCost.ToString() + " credits";
}
private int selectedItemCost
{
get
{
int cost = 0;
foreach (GUIComponent child in selectedItemList.children)
{
MapEntityPrefab ep = child.UserData as MapEntityPrefab;
if (ep == null) continue;
cost += ep.Price;
}
return cost;
}
}
public CampaignUI(CampaignMode campaign, GUIFrame container)
{
this.campaign = campaign;
@@ -107,16 +85,10 @@ namespace Barotrauma
int sellColumnWidth = (tabs[(int)Tab.Store].Rect.Width - 40) / 2 - 20;
selectedItemList = new GUIListBox(new Rectangle(0, 30, sellColumnWidth, tabs[(int)Tab.Store].Rect.Height - 80), Color.White * 0.7f, "", tabs[(int)Tab.Store]);
selectedItemList.OnSelected = DeselectItem;
var costText = new GUITextBlock(new Rectangle(0, 0, 100, 25), "Cost: ", "", Alignment.BottomLeft, Alignment.TopLeft, tabs[(int)Tab.Store]);
costText.TextGetter = CostTextGetter;
buyButton = new GUIButton(new Rectangle(selectedItemList.Rect.Width - 100, 0, 100, 25), "Buy", Alignment.Bottom, "", tabs[(int)Tab.Store]);
buyButton.OnClicked = BuyItems;
selectedItemList.OnSelected = SellItem;
storeItemList = new GUIListBox(new Rectangle(0, 30, sellColumnWidth, tabs[(int)Tab.Store].Rect.Height - 80), Color.White * 0.7f, Alignment.TopRight, "", tabs[(int)Tab.Store]);
storeItemList.OnSelected = SelectItem;
storeItemList.OnSelected = BuyItem;
int x = storeItemList.Rect.X - storeItemList.Parent.Rect.X;
@@ -140,11 +112,21 @@ namespace Barotrauma
SelectTab(Tab.Map);
GameMain.GameSession.Map.OnLocationSelected += SelectLocation;
UpdateLocationTab(campaign.Map.CurrentLocation);
campaign.Map.OnLocationSelected += SelectLocation;
campaign.Map.OnLocationChanged += (location) => UpdateLocationTab(location);
campaign.CargoManager.OnItemsChanged += RefreshItemTab;
}
private void UpdateLocationTab(Location location)
{
if (characterPreviewFrame != null)
{
characterPreviewFrame.Parent.RemoveChild(characterPreviewFrame);
characterPreviewFrame = null;
}
if (location.HireManager == null)
{
hireList.ClearChildren();
@@ -173,7 +155,7 @@ namespace Barotrauma
{
mapZoom += PlayerInput.ScrollWheelSpeed / 1000.0f;
mapZoom = MathHelper.Clamp(mapZoom, 1.0f, 4.0f);
if (GameMain.GameSession?.Map != null)
{
GameMain.GameSession.Map.Update(deltaTime, new Rectangle(
@@ -186,29 +168,14 @@ namespace Barotrauma
public void Draw(SpriteBatch spriteBatch)
{
/*if (characterList.CountChildren != CrewManager.CharacterInfos.Count)
if (selectedTab == Tab.Map && GameMain.GameSession?.Map != null)
{
UpdateCharacterLists();
GameMain.GameSession.Map.Draw(spriteBatch, new Rectangle(
tabs[(int)selectedTab].Rect.X + 20,
tabs[(int)selectedTab].Rect.Y + 20,
tabs[(int)selectedTab].Rect.Width - 310,
tabs[(int)selectedTab].Rect.Height - 40), mapZoom);
}
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, GameMain.ScissorTestEnable);
*/
if (selectedTab == Tab.Map && GameMain.GameSession?.Map != null)
{
GameMain.GameSession.Map.Draw(spriteBatch, new Rectangle(
tabs[(int)selectedTab].Rect.X + 20,
tabs[(int)selectedTab].Rect.Y + 20,
tabs[(int)selectedTab].Rect.Width - 310,
tabs[(int)selectedTab].Rect.Height - 40), mapZoom);
}
/*if (topPanel.UserData as Location != GameMain.GameSession.Map.CurrentLocation)
{
UpdateLocationTab(GameMain.GameSession.Map.CurrentLocation);
}
spriteBatch.End();*/
}
public void UpdateCharacterLists()
@@ -220,6 +187,34 @@ namespace Barotrauma
}
}
public void SelectLocation(Location location, LocationConnection connection)
{
GUIComponent locationPanel = tabs[(int)Tab.Map].GetChild("selectedlocation");
if (locationPanel != null) tabs[(int)Tab.Map].RemoveChild(locationPanel);
locationPanel = new GUIFrame(new Rectangle(0, 0, 250, 190), Color.Transparent, Alignment.TopRight, null, tabs[(int)Tab.Map]);
locationPanel.UserData = "selectedlocation";
if (location == null) return;
var titleText = new GUITextBlock(new Rectangle(0, 0, 250, 0), location.Name, "", Alignment.TopLeft, Alignment.TopCenter, locationPanel, true, GUI.LargeFont);
if (GameMain.GameSession.Map.SelectedConnection != null && GameMain.GameSession.Map.SelectedConnection.Mission != null)
{
var mission = GameMain.GameSession.Map.SelectedConnection.Mission;
new GUITextBlock(new Rectangle(0, titleText.Rect.Height + 20, 0, 20), "Mission: " + mission.Name, "", locationPanel);
new GUITextBlock(new Rectangle(0, titleText.Rect.Height + 40, 0, 20), "Reward: " + mission.Reward + " credits", "", locationPanel);
new GUITextBlock(new Rectangle(0, titleText.Rect.Height + 70, 0, 0), mission.Description, "", Alignment.TopLeft, Alignment.TopLeft, locationPanel, true, GUI.SmallFont);
}
if (startButton != null) startButton.Enabled = true;
selectedLevel = connection.Level;
OnLocationSelected?.Invoke(location, connection);
}
private void CreateItemFrame(MapEntityPrefab ep, GUIListBox listBox, int width)
{
@@ -255,82 +250,49 @@ namespace Barotrauma
Alignment.TopLeft, "", frame);
textBlock.Font = font;
textBlock.ToolTip = ep.Description;
}
private bool SelectItem(GUIComponent component, object obj)
private bool BuyItem(GUIComponent component, object obj)
{
MapEntityPrefab prefab = obj as MapEntityPrefab;
ItemPrefab prefab = obj as ItemPrefab;
if (prefab == null) return false;
CreateItemFrame(prefab, selectedItemList, selectedItemList.Rect.Width);
if (GameMain.Client != null && !GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign))
{
return false;
}
buyButton.Enabled = campaign.Money >= selectedItemCost;
if (prefab.Price > campaign.Money) return false;
campaign.CargoManager.PurchaseItem(prefab);
GameMain.Client?.SendCampaignState();
return false;
}
private bool DeselectItem(GUIComponent component, object obj)
private bool SellItem(GUIComponent component, object obj)
{
MapEntityPrefab prefab = obj as MapEntityPrefab;
ItemPrefab prefab = obj as ItemPrefab;
if (prefab == null) return false;
selectedItemList.RemoveChild(selectedItemList.children.Find(c => c.UserData == obj));
if (GameMain.Client != null && !GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign))
{
return false;
}
campaign.CargoManager.SellItem(prefab);
GameMain.Client?.SendCampaignState();
return false;
}
public void SelectLocation(Location location, LocationConnection connection)
private void RefreshItemTab()
{
GUIComponent locationPanel = tabs[(int)Tab.Map].GetChild("selectedlocation");
if (locationPanel != null) tabs[(int)Tab.Map].RemoveChild(locationPanel);
locationPanel = new GUIFrame(new Rectangle(0, 0, 250, 190), Color.Transparent, Alignment.TopRight, null, tabs[(int)Tab.Map]);
locationPanel.UserData = "selectedlocation";
if (location == null) return;
var titleText = new GUITextBlock(new Rectangle(0, 0, 250, 0), location.Name, "", Alignment.TopLeft, Alignment.TopCenter, locationPanel, true, GUI.LargeFont);
if (GameMain.GameSession.Map.SelectedConnection != null && GameMain.GameSession.Map.SelectedConnection.Mission != null)
selectedItemList.ClearChildren();
foreach (ItemPrefab ip in campaign.CargoManager.PurchasedItems)
{
var mission = GameMain.GameSession.Map.SelectedConnection.Mission;
new GUITextBlock(new Rectangle(0, titleText.Rect.Height + 20, 0, 20), "Mission: " + mission.Name, "", locationPanel);
new GUITextBlock(new Rectangle(0, titleText.Rect.Height + 40, 0, 20), "Reward: " + mission.Reward + " credits", "", locationPanel);
new GUITextBlock(new Rectangle(0, titleText.Rect.Height + 70, 0, 0), mission.Description, "", Alignment.TopLeft, Alignment.TopLeft, locationPanel, true, GUI.SmallFont);
CreateItemFrame(ip, selectedItemList, selectedItemList.Rect.Width);
}
if (startButton != null) startButton.Enabled = true;
selectedLevel = connection.Level;
OnLocationSelected?.Invoke(location, connection);
}
private bool BuyItems(GUIButton button, object obj)
{
int cost = selectedItemCost;
if (campaign.Money < cost) return false;
campaign.Money -= cost;
for (int i = selectedItemList.children.Count - 1; i >= 0; i--)
{
GUIComponent child = selectedItemList.children[i];
ItemPrefab ip = child.UserData as ItemPrefab;
if (ip == null) continue;
campaign.CargoManager.AddItem(ip);
selectedItemList.RemoveChild(child);
}
return false;
}
public void SelectTab(Tab tab)
@@ -373,7 +335,7 @@ namespace Barotrauma
return true;
}
private string GetMoney()
public string GetMoney()
{
return "Money: " + ((GameMain.GameSession == null) ? "0" : string.Format(CultureInfo.InvariantCulture, "{0:N0}", campaign.Money)) + " credits";
}
@@ -398,22 +360,23 @@ namespace Barotrauma
if (Character.Controlled != null && characterInfo == Character.Controlled.Info) return false;
if (previewFrame == null || previewFrame.UserData != characterInfo)
if (characterPreviewFrame == null || characterPreviewFrame.UserData != characterInfo)
{
int width = Math.Min(300, tabs[(int)Tab.Crew].Rect.Width - hireList.Rect.Width - characterList.Rect.Width - 50);
previewFrame = new GUIFrame(new Rectangle(0, 60, width, 300),
characterPreviewFrame = new GUIFrame(new Rectangle(0, 60, width, 300),
new Color(0.0f, 0.0f, 0.0f, 0.8f),
Alignment.TopCenter, "", tabs[(int)selectedTab]);
previewFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
previewFrame.UserData = characterInfo;
characterPreviewFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
characterPreviewFrame.UserData = characterInfo;
characterInfo.CreateInfoFrame(previewFrame);
characterInfo.CreateInfoFrame(characterPreviewFrame);
}
if (component.Parent == hireList)
{
GUIButton hireButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Hire", Alignment.BottomCenter, "", previewFrame);
GUIButton hireButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Hire", Alignment.BottomCenter, "", characterPreviewFrame);
hireButton.Enabled = campaign.Money >= characterInfo.Salary;
hireButton.UserData = characterInfo;
hireButton.OnClicked = HireCharacter;
}
@@ -423,15 +386,22 @@ namespace Barotrauma
private bool HireCharacter(GUIButton button, object selection)
{
/*CharacterInfo characterInfo = selection as CharacterInfo;
CharacterInfo characterInfo = selection as CharacterInfo;
if (characterInfo == null) return false;
if (campaign.TryHireCharacter(GameMain.GameSession.Map.CurrentLocation.HireManager, characterInfo))
SinglePlayerCampaign spCampaign = campaign as SinglePlayerCampaign;
if (spCampaign == null)
{
DebugConsole.ThrowError("Characters can only be hired in the single player campaign.\n" + Environment.StackTrace);
return false;
}
if (spCampaign.TryHireCharacter(GameMain.GameSession.Map.CurrentLocation.HireManager, characterInfo))
{
UpdateLocationTab(GameMain.GameSession.Map.CurrentLocation);
SelectCharacter(null, null);
}*/
UpdateCharacterLists();
}
return false;
}

View File

@@ -20,6 +20,11 @@ namespace Barotrauma
get { return GameMain.GameSession.CrewManager; }
}
public string GetMoney()
{
return campaignUI == null ? "" : campaignUI.GetMoney();
}
public LobbyScreen()
{
Rectangle panelRect = new Rectangle(
@@ -37,7 +42,7 @@ namespace Barotrauma
GUITextBlock moneyText = new GUITextBlock(new Rectangle(0, 0, 0, 25), "", "",
Alignment.BottomLeft, Alignment.BottomLeft, topPanel);
//moneyText.TextGetter = GetMoney;
moneyText.TextGetter = GetMoney;
GUIButton button = new GUIButton(new Rectangle(-240, 0, 100, 30), "Map", null, Alignment.BottomRight, "", topPanel);
button.UserData = CampaignUI.Tab.Map;

View File

@@ -1022,16 +1022,14 @@ namespace Barotrauma
menu.Draw(spriteBatch);
if (jobInfoFrame != null) jobInfoFrame.Draw(spriteBatch);
//if (previewPlayer!=null) previewPlayer.Draw(spriteBatch);
if (playerFrame != null) playerFrame.Draw(spriteBatch);
if (campaignContainer.Visible && campaignUI != null)
{
campaignUI.Draw(spriteBatch);
}
if (playerFrame != null) playerFrame.Draw(spriteBatch);
GUI.Draw((float)deltaTime, spriteBatch, null);
spriteBatch.End();
@@ -1180,6 +1178,9 @@ namespace Barotrauma
};
buttonX += 110;
}
var moneyText = new GUITextBlock(new Rectangle(120,0,200,20), "Money", "", Alignment.BottomLeft, Alignment.TopLeft, campaignContainer);
moneyText.TextGetter = campaignUI.GetMoney;
}
modeList.Select(2, true);
}

View File

@@ -1,20 +1,56 @@
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Barotrauma
{
class CargoManager
{
private List<ItemPrefab> purchasedItems;
private readonly List<ItemPrefab> purchasedItems;
private readonly CampaignMode campaign;
public Action OnItemsChanged;
public List<ItemPrefab> PurchasedItems
{
get { return purchasedItems; }
}
public CargoManager()
public CargoManager(CampaignMode campaign)
{
purchasedItems = new List<ItemPrefab>();
this.campaign = campaign;
}
public void AddItem(ItemPrefab item)
public void SetPurchasedItems(List<ItemPrefab> items)
{
purchasedItems.Clear();
purchasedItems.AddRange(items);
OnItemsChanged?.Invoke();
}
public void PurchaseItem(ItemPrefab item)
{
campaign.Money -= item.Price;
purchasedItems.Add(item);
OnItemsChanged?.Invoke();
}
public void SellItem(ItemPrefab item)
{
campaign.Money += item.Price;
purchasedItems.Remove(item);
OnItemsChanged?.Invoke();
}
public int GetTotalItemCost()
{
return purchasedItems.Sum(i => i.Price);
}
public void CreateItems()

View File

@@ -35,7 +35,7 @@ namespace Barotrauma
: base(preset, param)
{
Money = InitialMoney;
CargoManager = new CargoManager();
CargoManager = new CargoManager(this);
}
public void GenerateMap(string seed)

View File

@@ -69,12 +69,11 @@ namespace Barotrauma
GameMain.GameSession = new GameSession(new Submarine(sub.FilePath, ""), saveName, GameModePreset.list.Find(g => g.Name == "Campaign"));
var campaign = ((MultiplayerCampaign)GameMain.GameSession.GameMode);
campaign.GenerateMap(mapSeed);
campaign.map.OnLocationSelected += (loc, connection) => { campaign.LastUpdateID++; };
campaign.SetDelegates();
setupBox.Close();
GameMain.NetLobbyScreen.ToggleCampaignMode(true);
SaveUtil.SaveGame(GameMain.GameSession.SavePath);
campaign.LastSaveID++;
};
@@ -105,9 +104,17 @@ namespace Barotrauma
return true;
};
}
#endif
private void SetDelegates()
{
if (GameMain.Server != null)
{
CargoManager.OnItemsChanged += () => { LastUpdateID++; };
Map.OnLocationSelected += (loc, connection) => { LastUpdateID++; };
}
}
public override void Start()
{
base.Start();
@@ -186,6 +193,7 @@ namespace Barotrauma
if (!success)
{
#if CLIENT
var summaryScreen = GUIMessageBox.VisibleBox;
if (summaryScreen != null)
{
@@ -200,6 +208,7 @@ namespace Barotrauma
quitButton.OnClicked += GameMain.LobbyScreen.QuitToMainMenu;
quitButton.OnClicked += (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Remove(GUIMessageBox.VisibleBox); return true; };
}
#endif
}
}
else
@@ -232,9 +241,8 @@ namespace Barotrauma
campaign.map.SetLocation(ToolBox.GetAttributeInt(element, "currentlocation", 0));
}
campaign.map.OnLocationSelected += (loc, connection) => { campaign.LastUpdateID++; };
//campaign.savedOnStart = true;
campaign.SetDelegates();
return campaign;
}
@@ -258,8 +266,15 @@ namespace Barotrauma
msg.Write(map.CurrentLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.CurrentLocationIndex);
msg.Write(map.SelectedLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.SelectedLocationIndex);
}
msg.Write(Money);
msg.Write((UInt16)CargoManager.PurchasedItems.Count);
foreach (ItemPrefab ip in CargoManager.PurchasedItems)
{
msg.Write((UInt16)MapEntityPrefab.list.IndexOf(ip));
}
}
#if CLIENT
public static void ClientRead(NetBuffer msg)
{
@@ -271,6 +286,16 @@ namespace Barotrauma
UInt16 currentLocIndex = msg.ReadUInt16();
UInt16 selectedLocIndex = msg.ReadUInt16();
int money = msg.ReadInt32();
UInt16 purchasedItemCount = msg.ReadUInt16();
List<ItemPrefab> purchasedItems = new List<ItemPrefab>();
for (int i = 0; i<purchasedItemCount; i++)
{
UInt16 itemPrefabIndex = msg.ReadUInt16();
purchasedItems.Add(MapEntityPrefab.list[itemPrefabIndex] as ItemPrefab);
}
MultiplayerCampaign campaign = GameMain.GameSession?.GameMode as MultiplayerCampaign;
if (campaign == null || mapSeed != campaign.Map.Seed)
{
@@ -284,7 +309,7 @@ namespace Barotrauma
GameMain.NetLobbyScreen.ToggleCampaignMode(true);
if (NetIdUtils.IdMoreRecent(campaign.lastUpdateID, updateID)) return;
//server has a newer save file
if (NetIdUtils.IdMoreRecent(saveID, campaign.PendingSaveID))
{
@@ -305,10 +330,58 @@ namespace Barotrauma
{
campaign.Map.SetLocation(currentLocIndex == UInt16.MaxValue ? -1 : currentLocIndex);
campaign.Map.SelectLocation(selectedLocIndex == UInt16.MaxValue ? -1 : selectedLocIndex);
campaign.Money = money;
campaign.CargoManager.SetPurchasedItems(purchasedItems);
campaign.lastUpdateID = updateID;
}
}
#endif
public void ClientWrite(NetBuffer msg)
{
System.Diagnostics.Debug.Assert(map.Locations.Count < UInt16.MaxValue);
msg.Write(map.SelectedLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.SelectedLocationIndex);
msg.Write((UInt16)CargoManager.PurchasedItems.Count);
foreach (ItemPrefab ip in CargoManager.PurchasedItems)
{
msg.Write((UInt16)MapEntityPrefab.list.IndexOf(ip));
}
}
public void ServerRead(NetBuffer msg, Client sender)
{
UInt16 selectedLocIndex = msg.ReadUInt16();
UInt16 purchasedItemCount = msg.ReadUInt16();
List<ItemPrefab> purchasedItems = new List<ItemPrefab>();
for (int i = 0; i < purchasedItemCount; i++)
{
UInt16 itemPrefabIndex = msg.ReadUInt16();
purchasedItems.Add(MapEntityPrefab.list[itemPrefabIndex] as ItemPrefab);
}
if (!sender.HasPermission(ClientPermissions.ManageCampaign))
{
DebugConsole.ThrowError("Client \""+sender.name+"\" does not have a permission to manage the campaign");
return;
}
Map.SelectLocation(selectedLocIndex == UInt16.MaxValue ? -1 : selectedLocIndex);
List<ItemPrefab> currentItems = new List<ItemPrefab>(CargoManager.PurchasedItems);
foreach (ItemPrefab ip in currentItems)
{
CargoManager.SellItem(ip);
}
foreach (ItemPrefab ip in purchasedItems)
{
CargoManager.PurchaseItem(ip);
}
}
}
}

View File

@@ -29,6 +29,7 @@ namespace Barotrauma
private LocationConnection selectedConnection;
public Action<Location, LocationConnection> OnLocationSelected;
public Action<Location> OnLocationChanged;
public Location CurrentLocation
{
@@ -350,6 +351,8 @@ namespace Barotrauma
currentLocation = selectedLocation;
currentLocation.Discovered = true;
selectedLocation = null;
OnLocationChanged?.Invoke(currentLocation);
}
public void SetLocation(int index)
@@ -368,6 +371,8 @@ namespace Barotrauma
currentLocation = locations[index];
currentLocation.Discovered = true;
OnLocationChanged?.Invoke(currentLocation);
}
public void SelectLocation(int index)

View File

@@ -15,7 +15,9 @@ namespace Barotrauma.Networking
[Description("Kick")]
Kick = 2,
[Description("Ban")]
Ban = 4
Ban = 4,
[Description("Manage campaign")]
ManageCampaign = 8
}
class Client

View File

@@ -748,7 +748,7 @@ namespace Barotrauma.Networking
if (!sender.HasPermission(command))
{
Log("Client \""+sender.name+"\" sent a server command \""+command+"\". Permission denied.", ServerLog.MessageType.ServerMessage);
Log("Client \"" + sender.name + "\" sent a server command \"" + command + "\". Permission denied.", ServerLog.MessageType.ServerMessage);
return;
}
@@ -781,6 +781,13 @@ namespace Barotrauma.Networking
EndGame();
}
break;
case ClientPermissions.ManageCampaign:
MultiplayerCampaign campaign = GameMain.GameSession.GameMode as MultiplayerCampaign;
if (campaign != null)
{
campaign.ServerRead(inc, sender);
}
break;
}
inc.ReadPadBits();