diff --git a/Subsurface/Content/Items/Fabricators/fabricators.xml b/Subsurface/Content/Items/Fabricators/fabricators.xml
index d770f503e..88b3c0739 100644
--- a/Subsurface/Content/Items/Fabricators/fabricators.xml
+++ b/Subsurface/Content/Items/Fabricators/fabricators.xml
@@ -38,8 +38,8 @@
-
-
+
+
- height - 70)
- //{
- // messages.RemoveAt(0);
- //}
-
- //Vector2 messagePos = new Vector2(x + margin * 2, y + height - 70 - messages.Count()*20);
- //foreach (ColoredText message in messages)
- //{
- // spriteBatch.DrawString(GUI.Font, message.Text, messagePos, message.Color);
- // messagePos.Y += 20;
- //}
-
- //textBox.Draw(spriteBatch);
-
frame.Draw(spriteBatch);
}
diff --git a/Subsurface/Source/GUI/GUIProgressBar.cs b/Subsurface/Source/GUI/GUIProgressBar.cs
index a0b8dfcb1..858cf30bf 100644
--- a/Subsurface/Source/GUI/GUIProgressBar.cs
+++ b/Subsurface/Source/GUI/GUIProgressBar.cs
@@ -18,6 +18,7 @@ namespace Barotrauma
public bool IsHorizontal
{
get { return isHorizontal; }
+ set { isHorizontal = value; }
}
public float BarSize
diff --git a/Subsurface/Source/Items/Components/Machines/Deconstructor.cs b/Subsurface/Source/Items/Components/Machines/Deconstructor.cs
index bc325a1cb..c501a069d 100644
--- a/Subsurface/Source/Items/Components/Machines/Deconstructor.cs
+++ b/Subsurface/Source/Items/Components/Machines/Deconstructor.cs
@@ -17,13 +17,15 @@ namespace Barotrauma.Items.Components
ItemContainer container;
+ private float lastNetworkUpdate;
+
public Deconstructor(Item item, XElement element)
: base(item, element)
{
progressBar = new GUIProgressBar(new Rectangle(0,0,200,20), Color.Green, 0.0f, Alignment.BottomCenter, GuiFrame);
activateButton = new GUIButton(new Rectangle(0, 0, 200, 20), "Deconstruct", Alignment.TopCenter, GUI.Style, GuiFrame);
- activateButton.OnClicked = Activate;
+ activateButton.OnClicked = ToggleActive;
}
public override void Update(float deltaTime, Camera cam)
@@ -73,19 +75,31 @@ namespace Barotrauma.Items.Components
public override void DrawHUD(SpriteBatch spriteBatch, Character character)
{
+ GuiFrame.Update((float)Physics.step);
GuiFrame.Draw(spriteBatch);
}
- private bool Activate(GUIButton button, object obj)
+ private bool ToggleActive(GUIButton button, object obj)
+ {
+ SetActive(!IsActive);
+
+ item.NewComponentEvent(this, true, true);
+
+ return true;
+ }
+
+ private void SetActive(bool active)
{
container = item.GetComponent();
- if (container==null)
+ if (container == null)
{
DebugConsole.ThrowError("Error in Deconstructor.Activate: Deconstructors must have two ItemContainer components");
- return false;
+ return;
}
- if (IsActive)
+ IsActive = active;
+
+ if (!IsActive)
{
progressBar.BarSize = 0.0f;
progressTimer = 0.0f;
@@ -94,16 +108,38 @@ namespace Barotrauma.Items.Components
}
else
{
- if (!container.Inventory.Items.Any(i => i != null)) return false;
+ if (!container.Inventory.Items.Any(i => i != null)) return;
activateButton.Text = "Cancel";
}
- IsActive = !IsActive;
-
container.Inventory.Locked = IsActive;
+ }
+
+ public override bool FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message)
+ {
+
+ var containers = item.GetComponents();
+ containers[0].Inventory.FillNetworkData(type, message, null);
+ containers[1].Inventory.FillNetworkData(type, message, null);
+
+ message.Write(IsActive);
+
return true;
}
+
+ public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message, float sendingTime)
+ {
+ if (sendingTime < lastNetworkUpdate) return;
+
+ var containers = item.GetComponents();
+ containers[0].Inventory.ReadNetworkData(type, message, sendingTime);
+ containers[1].Inventory.ReadNetworkData(type, message, sendingTime);
+
+ SetActive(message.ReadBoolean());
+
+ lastNetworkUpdate = sendingTime;
+ }
}
}
diff --git a/Subsurface/Source/Items/Components/Machines/Engine.cs b/Subsurface/Source/Items/Components/Machines/Engine.cs
index 238d92a38..fd8cced69 100644
--- a/Subsurface/Source/Items/Components/Machines/Engine.cs
+++ b/Subsurface/Source/Items/Components/Machines/Engine.cs
@@ -12,13 +12,11 @@ namespace Barotrauma.Items.Components
class Engine : Powered
{
- float force;
+ private float force;
- float targetForce;
+ private float targetForce;
- float maxForce;
-
- float powerPerForce;
+ private float maxForce;
//[Editable, HasDefaultValue(1.0f, true)]
//public float PowerPerForce
diff --git a/Subsurface/Source/Items/Components/Machines/Fabricator.cs b/Subsurface/Source/Items/Components/Machines/Fabricator.cs
index f0bf709c0..b1abfe6a8 100644
--- a/Subsurface/Source/Items/Components/Machines/Fabricator.cs
+++ b/Subsurface/Source/Items/Components/Machines/Fabricator.cs
@@ -15,7 +15,7 @@ namespace Barotrauma.Items.Components
public readonly List RequiredItems;
public readonly float RequiredTime;
-
+
//ListOrSomething requiredLevels
public FabricableItem(XElement element)
@@ -45,14 +45,19 @@ namespace Barotrauma.Items.Components
class Fabricator : ItemComponent
{
- List fabricableItems;
+ private List fabricableItems;
- GUIListBox itemList;
+ private GUIListBox itemList;
- GUIFrame selectedItemFrame;
+ private GUIFrame selectedItemFrame;
- FabricableItem fabricatedItem;
- float timeUntilReady;
+ GUIProgressBar progressBar;
+ GUIButton activateButton;
+
+ private FabricableItem fabricatedItem;
+ private float timeUntilReady;
+
+ private float lastNetworkUpdate;
public Fabricator(Item item, XElement element)
: base(item, element)
@@ -96,10 +101,13 @@ namespace Barotrauma.Items.Components
if (selectedItemFrame != null) GuiFrame.RemoveChild(selectedItemFrame);
//int width = 200, height = 150;
- selectedItemFrame = new GUIFrame(new Rectangle(0,0,(int)(GuiFrame.Rect.Width*0.4f),200), Color.Black*0.8f, Alignment.CenterY | Alignment.Right, null, GuiFrame);
+ selectedItemFrame = new GUIFrame(new Rectangle(0,0,(int)(GuiFrame.Rect.Width*0.4f),250), Color.Black*0.8f, Alignment.CenterY | Alignment.Right, null, GuiFrame);
selectedItemFrame.Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f);
+ progressBar = new GUIProgressBar(new Rectangle(0, 0, 0, 20), Color.Green, GUI.Style, 0.0f, Alignment.BottomCenter, selectedItemFrame);
+ progressBar.IsHorizontal = true;
+
if (targetItem.TargetItem.sprite != null)
{
GUIImage img = new GUIImage(new Rectangle(10, 0, 40, 40), targetItem.TargetItem.sprite, Alignment.TopLeft, selectedItemFrame);
@@ -119,7 +127,7 @@ namespace Barotrauma.Items.Components
{
text += " - " + ip.Name + "\n";
}
- text += "Required time: "+targetItem.RequiredTime+" s";
+ text += "Required time: " + targetItem.RequiredTime + " s";
GUITextBlock textBlock = new GUITextBlock(
new Rectangle(0, 50, 0, 25),
@@ -129,11 +137,10 @@ namespace Barotrauma.Items.Components
Alignment.TopLeft, null,
selectedItemFrame);
- GUIButton button = new GUIButton(new Rectangle(0,0,100,20), "Create", Color.White, Alignment.CenterX | Alignment.Bottom, GUI.Style, selectedItemFrame);
- button.OnClicked = StartFabricating;
- button.UserData = targetItem;
-
-
+ activateButton = new GUIButton(new Rectangle(0, -30, 100, 20), "Create", Color.White, Alignment.CenterX | Alignment.Bottom, GUI.Style, selectedItemFrame);
+ activateButton.OnClicked = StartButtonClicked;
+ activateButton.UserData = targetItem;
+ activateButton.Enabled = false;
}
return true;
@@ -144,25 +151,80 @@ namespace Barotrauma.Items.Components
return (picker != null);
}
- private bool StartFabricating(GUIButton button, object obj)
+ private bool StartButtonClicked(GUIButton button, object obj)
{
- GUIComponent listElement = itemList.GetChild(obj);
+ if (fabricatedItem == null)
+ {
+ StartFabricating(obj as FabricableItem);
+
+ item.NewComponentEvent(this, true, true);
+ }
+ else
+ {
+ CancelFabricating();
+
+ item.NewComponentEvent(this, true, true);
+ }
- listElement.Color = Color.Green;
+ //listElement.Color = Color.Green;
+ //itemList.Enabled = false;
+
+ //activateButton.Text = "Cancel";
+
+ //fabricatedItem = obj as FabricableItem;
+ //IsActive = true;
+
+ //timeUntilReady = fabricatedItem.RequiredTime;
+
+ return true;
+ }
+
+ private void StartFabricating(FabricableItem selectedItem)
+ {
+ if (selectedItem == null) return;
+
itemList.Enabled = false;
- fabricatedItem = obj as FabricableItem;
+ activateButton.Text = "Cancel";
+
+ fabricatedItem = selectedItem;
IsActive = true;
timeUntilReady = fabricatedItem.RequiredTime;
- return true;
+ var containers = item.GetComponents();
+ containers[0].Inventory.Locked = true;
+ containers[1].Inventory.Locked = true;
+ }
+
+ private void CancelFabricating()
+ {
+ itemList.Enabled = true;
+ IsActive = false;
+ fabricatedItem = null;
+
+ if (activateButton != null)
+ {
+ activateButton.Text = "Create";
+ }
+ if (progressBar != null) progressBar.BarSize = 0.0f;
+
+ timeUntilReady = 0.0f;
+
+ var containers = item.GetComponents();
+ containers[0].Inventory.Locked = false;
+ containers[1].Inventory.Locked = false;
}
public override void Update(float deltaTime, Camera cam)
{
timeUntilReady -= deltaTime;
+ if (progressBar!=null)
+ {
+ progressBar.BarSize = fabricatedItem == null ? 0.0f : (fabricatedItem.RequiredTime - timeUntilReady) / fabricatedItem.RequiredTime;
+ }
+
if (timeUntilReady > 0.0f) return;
var containers = item.GetComponents();
@@ -180,9 +242,7 @@ namespace Barotrauma.Items.Components
Item.Spawner.QueueItem(fabricatedItem.TargetItem, containers[1].Inventory);
- itemList.Enabled = true;
- IsActive = false;
- fabricatedItem = null;
+ CancelFabricating();
}
public override void DrawHUD(SpriteBatch spriteBatch, Character character)
@@ -190,13 +250,13 @@ namespace Barotrauma.Items.Components
FabricableItem targetItem = itemList.SelectedData as FabricableItem;
if (targetItem != null)
{
- selectedItemFrame.GetChild().Enabled = true;
+ activateButton.Enabled = true;
ItemContainer container = item.GetComponent();
foreach (ItemPrefab ip in targetItem.RequiredItems)
{
if (Array.Find(container.Inventory.Items, it => it != null && it.Prefab == ip) != null) continue;
- selectedItemFrame.GetChild().Enabled = false;
+ activateButton.Enabled = false;
break;
}
}
@@ -213,5 +273,39 @@ namespace Barotrauma.Items.Components
// selectedItemFrame.Draw(spriteBatch);
//}
}
+
+ public override bool FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message)
+ {
+ int itemIndex = fabricatedItem == null ? -1 : fabricableItems.IndexOf(fabricatedItem);
+
+ message.WriteRangedInteger(-1, fabricableItems.Count-1, itemIndex);
+
+ return true;
+ }
+
+ public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message, float sendingTime)
+ {
+ if (sendingTime < lastNetworkUpdate) return;
+
+ int itemIndex = message.ReadRangedInteger(-1, fabricableItems.Count-1);
+
+ if (itemIndex == -1)
+ {
+ CancelFabricating();
+ }
+ else
+ {
+ //if already fabricating the selected item, return
+ if (fabricatedItem != null && fabricableItems.IndexOf(fabricatedItem) != itemIndex) return;
+
+ if (itemIndex < 0 || itemIndex >= fabricableItems.Count) return;
+
+ SelectItem(null, fabricableItems[itemIndex]);
+ StartFabricating(fabricableItems[itemIndex]);
+ timeUntilReady -= sendingTime - (float)Lidgren.Network.NetTime.Now;
+ }
+
+ lastNetworkUpdate = sendingTime;
+ }
}
}
diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs
index d58a9c465..1baec41b4 100644
--- a/Subsurface/Source/Items/Components/Machines/Pump.cs
+++ b/Subsurface/Source/Items/Components/Machines/Pump.cs
@@ -16,7 +16,7 @@ namespace Barotrauma.Items.Components
float lastUpdate;
- Hull hull1, hull2;
+ Hull hull1;
[HasDefaultValue(0.0f, true)]
public float FlowPercentage
@@ -82,7 +82,7 @@ namespace Barotrauma.Items.Components
ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
- if (hull2 == null && hull1 == null) return;
+ if (hull1 == null) return;
float powerFactor = (currPowerConsumption==0.0f) ? 1.0f : voltage;
//flowPercentage = maxFlow * powerFactor;
@@ -92,11 +92,11 @@ namespace Barotrauma.Items.Components
hull1.Volume += currFlow;
if (hull1.Volume > hull1.FullVolume) hull1.Pressure += 0.5f;
- if (hull2 != null)
- {
- hull2.Volume -= currFlow;
- if (hull2.Volume > hull1.FullVolume) hull2.Pressure += 0.5f;
- }
+ //if (hull2 != null)
+ //{
+ // hull2.Volume -= currFlow;
+ // if (hull2.Volume > hull1.FullVolume) hull2.Pressure += 0.5f;
+ //}
voltage = 0.0f;
}
diff --git a/Subsurface/Source/Items/FixRequirement.cs b/Subsurface/Source/Items/FixRequirement.cs
index de2441b78..91dbbf812 100644
--- a/Subsurface/Source/Items/FixRequirement.cs
+++ b/Subsurface/Source/Items/FixRequirement.cs
@@ -81,7 +81,7 @@ namespace Barotrauma
private static void CreateGUIFrame(Item item)
{
int width = 400, height = 500;
- int x = 0, y = 0;
+ int y = 0;
frame = new GUIFrame(new Rectangle(0, 0, width, height), null, Alignment.Center, GUI.Style);
frame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs
index da8271979..b40326d1c 100644
--- a/Subsurface/Source/Items/Item.cs
+++ b/Subsurface/Source/Items/Item.cs
@@ -228,7 +228,7 @@ namespace Barotrauma
public override string ToString()
{
- return (GameMain.DebugDraw) ? Name +"(ID: "+ID+")" : Name;
+ return (GameMain.DebugDraw) ? Name + "(ID: " + ID + ")" : Name;
}
public List AllPropertyObjects
diff --git a/Subsurface/Source/Items/ItemSpawner.cs b/Subsurface/Source/Items/ItemSpawner.cs
index dcf6406c8..9ee491204 100644
--- a/Subsurface/Source/Items/ItemSpawner.cs
+++ b/Subsurface/Source/Items/ItemSpawner.cs
@@ -15,8 +15,14 @@ namespace Barotrauma
spawnQueue = new Queue>();
}
- public void QueueItem(ItemPrefab itemPrefab, Vector2 position)
+ public void QueueItem(ItemPrefab itemPrefab, Vector2 position, bool isNetworkMessage = false)
{
+ if (!isNetworkMessage && GameMain.Client!=null)
+ {
+ //clients aren't allowed to spawn new items unless the server says so
+ return;
+ }
+
var itemInfo = new Pair();
itemInfo.First = itemPrefab;
itemInfo.Second = position;
@@ -24,8 +30,14 @@ namespace Barotrauma
spawnQueue.Enqueue(itemInfo);
}
- public void QueueItem(ItemPrefab itemPrefab, Inventory inventory)
+ public void QueueItem(ItemPrefab itemPrefab, Inventory inventory, bool isNetworkMessage = false)
{
+ if (!isNetworkMessage && GameMain.Client != null)
+ {
+ //clients aren't allowed to spawn new items unless the server says so
+ return;
+ }
+
var itemInfo = new Pair();
itemInfo.First = itemPrefab;
itemInfo.Second = inventory;
@@ -35,24 +47,91 @@ namespace Barotrauma
public void Update()
{
+ if (!spawnQueue.Any()) return;
+
+ List
- items = new List
- ();
+ List inventories = new List();
+
while (spawnQueue.Count>0)
{
var itemInfo = spawnQueue.Dequeue();
if (itemInfo.Second is Vector2)
{
- new Item(itemInfo.First, (Vector2)itemInfo.Second - Submarine.HiddenSubPosition, null);
+ Vector2 position = (Vector2)itemInfo.Second - Submarine.HiddenSubPosition;
+
+ items.Add(new Item(itemInfo.First, position, null));
+ inventories.Add(null);
+
}
else if (itemInfo.Second is Inventory)
{
-
var item = new Item(itemInfo.First, Vector2.Zero, null);
var inventory = itemInfo.Second as Inventory;
inventory.TryPutItem(item, null, false);
+
+ items.Add(item);
+ inventories.Add(inventory);
}
- //!!!!!!!!!!!!!!!!!!!!!!
-
+ }
+
+ if (GameMain.Server != null) GameMain.Server.SendItemSpawnMessage(items, inventories);
+ }
+
+ public void FillNetworkData(Lidgren.Network.NetBuffer message, List
- items, List inventories)
+ {
+ message.Write((byte)items.Count);
+
+ for (int i = 0; i < items.Count; i++)
+ {
+ message.Write(items[i].Prefab.Name);
+ message.Write(items[i].ID);
+
+ message.Write(inventories[i].Owner == null ? 0 : inventories[i].Owner.ID);
+ }
+ }
+
+ public void ReadNetworkData(Lidgren.Network.NetBuffer message)
+ {
+ var itemCount = message.ReadByte();
+ for (int i = 0; i < itemCount; i++)
+ {
+ string itemName = message.ReadString();
+ ushort itemId = message.ReadUInt16();
+
+ ushort inventoryId = message.ReadUInt16();
+
+
+ var prefab = MapEntityPrefab.list.Find(me => me.Name == itemName);
+ if (prefab == null) continue;
+
+ var itemPrefab = prefab as ItemPrefab;
+ if (itemPrefab == null) continue;
+
+ Inventory inventory = null;
+
+ var inventoryOwner = Entity.FindEntityByID(inventoryId);
+ if (inventoryOwner != null)
+ {
+ if (inventoryOwner is Character)
+ {
+ inventory = (inventoryOwner as Character).Inventory;
+ }
+ else if (inventoryOwner is Item)
+ {
+ var containers = (inventoryOwner as Item).GetComponents();
+ if (containers!=null && containers.Any())
+ {
+ inventory = containers.Last().Inventory;
+ }
+ }
+ }
+
+ var item = new Item(itemPrefab, Vector2.Zero, null);
+ item.ID = itemId;
+ if (inventory != null) inventory.TryPutItem(item, null, false);
+
}
}
}
@@ -66,18 +145,55 @@ namespace Barotrauma
removeQueue = new Queue
- ();
}
- public void QueueItem(Item item)
+ public void QueueItem(Item item, bool isNetworkMessage = false)
{
+ if (!isNetworkMessage && GameMain.Client != null)
+ {
+ //clients aren't allowed to remove items unless the server says so
+ return;
+ }
+
removeQueue.Enqueue(item);
}
public void Update()
{
+ if (!removeQueue.Any()) return;
+
+ List
- items = new List
- ();
+
while (removeQueue.Count > 0)
{
var item = removeQueue.Dequeue();
item.Remove();
+
+ items.Add(item);
+ }
+
+ if (GameMain.Server != null) GameMain.Server.SendItemRemoveMessage(items);
+ }
+
+ public void FillNetworkData(Lidgren.Network.NetBuffer message, List
- items)
+ {
+ message.Write((byte)items.Count);
+ foreach (Item item in items)
+ {
+ message.Write(item.ID);
+ }
+ }
+
+ public void ReadNetworkData(Lidgren.Network.NetBuffer message)
+ {
+ var itemCount = message.ReadByte();
+ for (int i = 0; i items, List inventories = null)
+ {
+ if (items == null || !items.Any()) return;
+
+ NetOutgoingMessage message = server.CreateMessage();
+ message.Write((byte)PacketTypes.NewItem);
+
+ Item.Spawner.FillNetworkData(message, items, inventories);
+
+ SendMessage(message, NetDeliveryMethod.ReliableUnordered);
+ }
+
+ public void SendItemRemoveMessage(List
- items)
+ {
+ if (items == null || !items.Any()) return;
+
+ NetOutgoingMessage message = server.CreateMessage();
+
+ Item.Remover.FillNetworkData(message, items);
+
+ SendMessage(message, NetDeliveryMethod.ReliableUnordered);
+ }
+
private void AssignJobs()
{
List unassigned = new List(ConnectedClients);
@@ -1305,16 +1328,7 @@ namespace Barotrauma.Networking
if (assignedClientCount[i] < JobPrefab.List[i].MinNumber) unassignedJobsFound = true;
}
}
-
- //share the rest of the jobs according to the ''commonness'' of the job
- //float totalCommonness = 0.0f;
- //for (int i = 0; i < JobPrefab.List.Count; i++)
- //{
- // if (JobPrefab.List[i].AllowAlways || JobPrefab.List[i].MaxNumber == 0) continue;
-
- // totalCommonness += JobPrefab.List[i].Commonness;
- //}
-
+
//find a suitable job for the rest of the players
for (int i = unassigned.Count - 1; i >= 0; i--)
{
diff --git a/Subsurface/Source/Networking/NetworkEvent.cs b/Subsurface/Source/Networking/NetworkEvent.cs
index 2d767393f..c0d4e3a5e 100644
--- a/Subsurface/Source/Networking/NetworkEvent.cs
+++ b/Subsurface/Source/Networking/NetworkEvent.cs
@@ -167,7 +167,7 @@ namespace Barotrauma.Networking
}
catch
{
- int afghj = 1;
+
}
//+1 because msgLength is one additional byte
currPos += msgLength + 1;
diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs
index f7e7486de..bad6b2348 100644
--- a/Subsurface/Source/Networking/NetworkMember.cs
+++ b/Subsurface/Source/Networking/NetworkMember.cs
@@ -19,6 +19,8 @@ namespace Barotrauma.Networking
StartGame, EndGame,
+ NewItem, RemoveItem,
+
CharacterInfo,
Chatmessage, UpdateNetLobby,
diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo
index 87d7d2a57..a2b073127 100644
Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ