diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index a07715f69..7b453022a 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -68,7 +68,7 @@ namespace Barotrauma } } - class Inventory + class Inventory : IServerSerializable, IClientSerializable { public static InventorySlot draggingSlot; public static Item draggingItem; @@ -76,9 +76,7 @@ namespace Barotrauma public static Item doubleClickedItem; public readonly Entity Owner; - - protected float lastUpdate; - + private int slotsPerRow; public int SlotsPerRow @@ -525,6 +523,95 @@ namespace Barotrauma item.Sprite.Draw(spriteBatch, new Vector2(rect.X + rect.Width / 2, rect.Y + rect.Height / 2), item.Color); } - + + public void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null) + { + ServerWrite(msg, null); + } + + public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c) + { + List prevItems = new List(Items); + ushort[] newItemIDs = new ushort[capacity]; + + for (int i = 0; i < capacity; i++) + { + newItemIDs[i] = msg.ReadUInt16(); + } + + if (c == null || c.Character == null || !c.Character.CanAccessInventory(this)) + { + return; + } + + for (int i = 0; i < capacity; i++) + { + if (newItemIDs[i] == 0) + { + if (Items[i] != null) Items[i].Drop(); + } + else + { + var item = Entity.FindEntityByID(newItemIDs[i]) as Item; + if (item == null) continue; + + if (GameMain.Server != null) + { + if (!c.Character.CanAccessItem(item)) continue; + } + TryPutItem(item, i, true); + } + } + + foreach (Item item in Items) + { + if (item == null) continue; + if (!prevItems.Contains(item)) + { + GameServer.Log(c.Character + " placed " + item.Name + " in " + Owner, Color.Orange); + } + } + foreach (Item item in prevItems) + { + if (item == null) continue; + if (!Items.Contains(item)) + { + GameServer.Log(c.Character + " removed " + item.Name + " from " + Owner.ToString(), Color.Orange); + } + } + } + + public void ServerWrite(Lidgren.Network.NetBuffer msg, Barotrauma.Networking.Client c, object[] extraData = null) + { + for (int i = 0; i < capacity; i++) + { + msg.Write((ushort)(Items[i] == null ? 0 : Items[i].ID)); + } + } + + public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime) + { + ushort[] newItemIDs = new ushort[capacity]; + + for (int i = 0; i < capacity; i++) + { + newItemIDs[i] = msg.ReadUInt16(); + } + + for (int i = 0; i < capacity; i++) + { + if (newItemIDs[i] == 0) + { + if (Items[i] != null) Items[i].Drop(); + } + else + { + var item = Entity.FindEntityByID(newItemIDs[i]) as Item; + if (item == null) continue; + + TryPutItem(item, i, true); + } + } + } } } diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index a07a9256e..eda1f080a 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -733,10 +733,10 @@ namespace Barotrauma if (!MathUtils.IsValid(damage)) return; - //if (damage != sections[sectionIndex].damage && Math.Abs(sections[sectionIndex].lastSentDamage - damage) > 5.0f) - //{ - // sections[sectionIndex].lastSentDamage = damage; - //} + if (GameMain.Server != null && damage != sections[sectionIndex].damage) + { + GameMain.Server.CreateEntityEvent(this); + } if (damage < prefab.MaxHealth*0.5f) { @@ -852,8 +852,6 @@ namespace Barotrauma for (int i = 0; i < sections.Length; i++) { msg.WriteRangedSingle(sections[i].damage / Health, 0.0f, 1.0f, 8); - - //sections[i].lastSentDamage = sections[i].damage; } }