Inventory syncing, objHeader is passed to the ClientRead/ServerRead methods so they can determine how to read the msg (is it an inventory update, position, input, etc)

This commit is contained in:
Regalis
2016-12-10 16:39:58 +02:00
parent 108dddf082
commit 1f454d593e
21 changed files with 262 additions and 166 deletions
+17 -17
View File
@@ -141,7 +141,7 @@ namespace Barotrauma
/// <summary>
/// If there is room, puts the item in the inventory and returns true, otherwise returns false
/// </summary>
public override bool TryPutItem(Item item, List<InvSlotType> allowedSlots = null)
public override bool TryPutItem(Item item, List<InvSlotType> allowedSlots = null, bool createNetworkEvent = true)
{
if (allowedSlots == null || ! allowedSlots.Any()) return false;
@@ -152,7 +152,7 @@ namespace Barotrauma
{
if (Items[i] != null || limbSlots[i] != InvSlotType.Any) continue;
PutItem(item, i);
PutItem(item, i, true, createNetworkEvent);
item.Unequip(character);
return true;
}
@@ -178,7 +178,7 @@ namespace Barotrauma
{
if (allowedSlot.HasFlag(limbSlots[i]) && Items[i] == null)
{
PutItem(item, i, !placed);
PutItem(item, i, !placed, createNetworkEvent);
item.Equip(character);
placed = true;
}
@@ -194,7 +194,7 @@ namespace Barotrauma
return placed;
}
public override bool TryPutItem(Item item, int index, bool allowSwapping)
public override bool TryPutItem(Item item, int index, bool allowSwapping, bool createNetworkEvent = true)
{
//there's already an item in the slot
if (Items[index] != null)
@@ -224,8 +224,8 @@ namespace Barotrauma
Items[currentIndex] = null;
Items[index] = null;
//if the item in the slot can be moved to the slot of the moved item
if (TryPutItem(existingItem, currentIndex, false) &&
TryPutItem(item, index, false))
if (TryPutItem(existingItem, currentIndex, false, createNetworkEvent) &&
TryPutItem(item, index, false, createNetworkEvent))
{
}
@@ -235,8 +235,8 @@ namespace Barotrauma
Items[index] = null;
//swapping the items failed -> move them back to where they were
TryPutItem(item, currentIndex, false);
TryPutItem(existingItem, index, false);
TryPutItem(item, currentIndex, false, createNetworkEvent);
TryPutItem(existingItem, index, false, createNetworkEvent);
}
}
@@ -248,7 +248,7 @@ namespace Barotrauma
if (!item.AllowedSlots.Contains(InvSlotType.Any)) return false;
if (Items[index] != null) return Items[index] == item;
PutItem(item, index, true);
PutItem(item, index, true, createNetworkEvent);
return true;
}
@@ -274,12 +274,12 @@ namespace Barotrauma
if (!slotsFree) return false;
return TryPutItem(item, new List<InvSlotType>() {placeToSlots});
return TryPutItem(item, new List<InvSlotType>() {placeToSlots}, createNetworkEvent);
}
protected override void PutItem(Item item, int i, bool removeItem = true)
protected override void PutItem(Item item, int i, bool removeItem = true, bool createNetworkEvent = true)
{
base.PutItem(item, i, removeItem);
base.PutItem(item, i, removeItem, createNetworkEvent);
CreateSlots();
}
@@ -321,7 +321,7 @@ namespace Barotrauma
{
if (doubleClickedItem.ParentInventory != this)
{
TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots);
TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots, true);
}
else
{
@@ -330,24 +330,24 @@ namespace Barotrauma
var selectedContainer = character.SelectedConstruction.GetComponent<ItemContainer>();
if (selectedContainer != null && selectedContainer.Inventory != null)
{
selectedContainer.Inventory.TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots);
selectedContainer.Inventory.TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots, true);
}
}
else if (character.SelectedCharacter != null && character.SelectedCharacter.Inventory != null)
{
character.SelectedCharacter.Inventory.TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots);
character.SelectedCharacter.Inventory.TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots, true);
}
else //doubleclicked and no other inventory is selected
{
//not equipped -> attempt to equip
if (IsInLimbSlot(doubleClickedItem, InvSlotType.Any))
{
TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots.FindAll(i => i != InvSlotType.Any));
TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots.FindAll(i => i != InvSlotType.Any), true);
}
//equipped -> attempt to unequip
else if (doubleClickedItem.AllowedSlots.Contains(InvSlotType.Any))
{
TryPutItem(doubleClickedItem, new List<InvSlotType>() { InvSlotType.Any });
TryPutItem(doubleClickedItem, new List<InvSlotType>() { InvSlotType.Any }, true);
}
}
}
+1 -1
View File
@@ -505,7 +505,7 @@ namespace Barotrauma.Items.Components
msg.WriteRangedSingle(stuck, 0.0f, 100.0f, 8);
}
public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
public void ClientRead(ServerNetObject type, Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
SetState(msg.ReadBoolean(), true);
Stuck = msg.ReadRangedSingle(0.0f, 100.0f, 8);
@@ -263,7 +263,7 @@ namespace Barotrauma.Items.Components
Item item = MapEntity.FindEntityByID(itemIds[i]) as Item;
if (item == null) continue;
Inventory.TryPutItem(item, i, false);
Inventory.TryPutItem(item, i, false, false);
}
itemIds = null;
@@ -234,7 +234,7 @@ namespace Barotrauma.Items.Components
msg.Write(IsActive);
}
public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
public void ServerRead(ClientNetObject type, Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
float flowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f;
bool isActive = msg.ReadBoolean();
@@ -252,7 +252,7 @@ namespace Barotrauma.Items.Components
msg.Write(IsActive);
}
public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
public void ClientRead(ServerNetObject type, Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
FlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f;
IsActive = msg.ReadBoolean();
@@ -431,7 +431,7 @@ namespace Barotrauma.Items.Components
msg.Write(IsActive);
}
public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
public void ServerRead(ClientNetObject type, Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
bool isActive = msg.ReadBoolean();
@@ -448,7 +448,7 @@ namespace Barotrauma.Items.Components
msg.Write(IsActive);
}
public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
public void ClientRead(ServerNetObject type, Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
IsActive = msg.ReadBoolean();
isActiveTickBox.Selected = IsActive;
@@ -561,7 +561,7 @@ namespace Barotrauma.Items.Components
msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8);
}
public void ServerRead(NetIncomingMessage msg, Client c)
public void ServerRead(ClientNetObject type, NetIncomingMessage msg, Client c)
{
bool autoTemp = msg.ReadBoolean();
float shutDownTemp = msg.ReadRangedSingle(0.0f, 10000.0f, 8);
@@ -591,7 +591,7 @@ namespace Barotrauma.Items.Components
msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8);
}
public void ClientRead(NetIncomingMessage msg, float sendingTime)
public void ClientRead(ServerNetObject type, NetIncomingMessage msg, float sendingTime)
{
Temperature = msg.ReadRangedSingle(0.0f, 10000.0f, 16);
@@ -486,7 +486,7 @@ namespace Barotrauma.Items.Components
}
}
public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
public void ServerRead(ClientNetObject type, Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
bool autoPilot = msg.ReadBoolean();
Vector2 newTargetVelocity = targetVelocity;
@@ -569,7 +569,7 @@ namespace Barotrauma.Items.Components
}
}
public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
public void ClientRead(ServerNetObject type, Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
bool autoPilot = msg.ReadBoolean();
Vector2 newTargetVelocity = targetVelocity;
+32 -15
View File
@@ -172,31 +172,31 @@ namespace Barotrauma
/// <summary>
/// If there is room, puts the item in the inventory and returns true, otherwise returns false
/// </summary>
public virtual bool TryPutItem(Item item, List<InvSlotType> allowedSlots = null)
public virtual bool TryPutItem(Item item, List<InvSlotType> allowedSlots = null, bool createNetworkEvent = true)
{
int slot = FindAllowedSlot(item);
if (slot < 0) return false;
PutItem(item, slot);
PutItem(item, slot, true, createNetworkEvent);
return true;
}
public virtual bool TryPutItem(Item item, int i, bool allowSwapping)
public virtual bool TryPutItem(Item item, int i, bool allowSwapping, bool createNetworkEvent = true)
{
if (Owner == null) return false;
if (CanBePut(item,i))
{
PutItem(item, i);
PutItem(item, i, true, createNetworkEvent);
return true;
}
else
{
if (slots != null) slots[i].ShowBorderHighlight(Color.Red, 0.1f, 0.9f);
if (slots != null && createNetworkEvent) slots[i].ShowBorderHighlight(Color.Red, 0.1f, 0.9f);
return false;
}
}
protected virtual void PutItem(Item item, int i, bool removeItem = true)
protected virtual void PutItem(Item item, int i, bool removeItem = true, bool createNetworkEvent = true)
{
if (Owner == null) return;
@@ -215,6 +215,23 @@ namespace Barotrauma
{
item.body.Enabled = false;
}
if (createNetworkEvent)
{
CreateNetworkEvent();
}
}
private void CreateNetworkEvent()
{
if (GameMain.Server != null)
{
GameMain.Server.CreateEntityEvent(Owner as IServerSerializable, new object[] { NetEntityEvent.Type.InventoryState });
}
else if (GameMain.Client != null)
{
GameMain.Client.CreateEntityEvent(Owner as IClientSerializable, new object[] { NetEntityEvent.Type.InventoryState });
}
}
public Item FindItem(string itemName)
@@ -232,8 +249,9 @@ namespace Barotrauma
for (int n = 0; n < capacity; n++)
{
if (Items[n] != item) continue;
Items[n] = null;
item.ParentInventory = null;
item.ParentInventory = null;
}
}
@@ -285,10 +303,7 @@ namespace Barotrauma
{
if (!PlayerInput.LeftButtonHeld())
{
if (Owner != null)
{
}
CreateNetworkEvent();
DropItem(draggingItem);
}
@@ -529,7 +544,7 @@ namespace Barotrauma
ServerWrite(msg, null);
}
public void ServerRead(Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
public void ServerRead(ClientNetObject type, Lidgren.Network.NetIncomingMessage msg, Barotrauma.Networking.Client c)
{
List<Item> prevItems = new List<Item>(Items);
ushort[] newItemIDs = new ushort[capacity];
@@ -559,10 +574,12 @@ namespace Barotrauma
{
if (!c.Character.CanAccessItem(item)) continue;
}
TryPutItem(item, i, true);
TryPutItem(item, i, true, false);
}
}
GameMain.Server.CreateEntityEvent(Owner as IServerSerializable, new object[] { NetEntityEvent.Type.InventoryState });
foreach (Item item in Items)
{
if (item == null) continue;
@@ -589,7 +606,7 @@ namespace Barotrauma
}
}
public void ClientRead(Lidgren.Network.NetIncomingMessage msg, float sendingTime)
public void ClientRead(ServerNetObject type, Lidgren.Network.NetIncomingMessage msg, float sendingTime)
{
ushort[] newItemIDs = new ushort[capacity];
@@ -609,7 +626,7 @@ namespace Barotrauma
var item = Entity.FindEntityByID(newItemIDs[i]) as Item;
if (item == null) continue;
TryPutItem(item, i, true);
TryPutItem(item, i, true, false);
}
}
}
+61 -19
View File
@@ -1638,36 +1638,78 @@ namespace Barotrauma
public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null)
{
if (extraData == null) return;
if (extraData == null || extraData.Length == 0 || !(extraData[0] is NetEntityEvent.Type))
{
return;
}
else if ((NetEntityEvent.Type)extraData[0] == NetEntityEvent.Type.ComponentState)
{
msg.Write(true);
int componentIndex = (int)extraData[0];
msg.Write((byte)componentIndex);
int componentIndex = (int)extraData[1];
msg.Write((byte)componentIndex);
(components[componentIndex] as IServerSerializable).ServerWrite(msg, c, extraData);
(components[componentIndex] as IServerSerializable).ServerWrite(msg, c, extraData);
}
else if ((NetEntityEvent.Type)extraData[0] == NetEntityEvent.Type.InventoryState)
{
msg.Write(false);
ownInventory.ServerWrite(msg, c, extraData);
}
}
public void ClientRead(NetIncomingMessage msg, float sendingTime)
public void ClientRead(ServerNetObject type, NetIncomingMessage msg, float sendingTime)
{
int componentIndex = msg.ReadByte();
bool isComponentUpdate = msg.ReadBoolean();
(components[componentIndex] as IServerSerializable).ClientRead(msg, sendingTime);
if (isComponentUpdate)
{
int componentIndex = msg.ReadByte();
(components[componentIndex] as IServerSerializable).ClientRead(type, msg, sendingTime);
}
else
{
ownInventory.ClientRead(type, msg, sendingTime);
}
}
public void ClientWrite(NetBuffer msg, object[] extraData = null)
{
if (extraData == null) return;
if (extraData == null || extraData.Length == 0 || !(extraData[0] is NetEntityEvent.Type))
{
return;
}
else if ((NetEntityEvent.Type)extraData[0] == NetEntityEvent.Type.ComponentState)
{
msg.Write(true);
int componentIndex = (int)extraData[0];
msg.Write((byte)componentIndex);
int componentIndex = (int)extraData[1];
msg.Write((byte)componentIndex);
(components[componentIndex] as IClientSerializable).ClientWrite(msg, extraData);
(components[componentIndex] as IClientSerializable).ClientWrite(msg, extraData);
}
else if ((NetEntityEvent.Type)extraData[0] == NetEntityEvent.Type.InventoryState)
{
msg.Write(false);
ownInventory.ClientWrite(msg, extraData);
}
}
public void ServerRead(NetIncomingMessage msg, Client c)
public void ServerRead(ClientNetObject type, NetIncomingMessage msg, Client c)
{
int componentIndex = msg.ReadByte();
(components[componentIndex] as IClientSerializable).ServerRead(msg, c);
bool isComponentUpdate = msg.ReadBoolean();
if (isComponentUpdate)
{
int componentIndex = msg.ReadByte();
(components[componentIndex] as IClientSerializable).ServerRead(type, msg, c);
}
else
{
ownInventory.ServerRead(type, msg, c);
}
}
public void WriteSpawnData(NetBuffer msg)
@@ -1773,11 +1815,11 @@ namespace Barotrauma
if (inventory != null)
{
if (inventorySlotIndex >= 0 && inventorySlotIndex < 255 &&
inventory.TryPutItem(item, inventorySlotIndex, false))
inventory.TryPutItem(item, inventorySlotIndex, false, false))
{
return null;
}
inventory.TryPutItem(item, item.AllowedSlots);
inventory.TryPutItem(item, item.AllowedSlots, false);
}
return item;
@@ -1896,7 +1938,7 @@ namespace Barotrauma
if (GameMain.Server == null) return;
int index = components.IndexOf(ic);
GameMain.Server.CreateEntityEvent(this, new object[] { index });
GameMain.Server.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.ComponentState, index });
}
public void CreateClientEvent<T>(T ic) where T : ItemComponent, IClientSerializable
@@ -1904,7 +1946,7 @@ namespace Barotrauma
if (GameMain.Client == null) return;
int index = components.IndexOf(ic);
GameMain.Client.CreateEntityEvent(this, new object[] { index });
GameMain.Client.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.ComponentState, index });
}
public override void ShallowRemove()
+4 -4
View File
@@ -45,9 +45,9 @@ namespace Barotrauma
}
public override bool TryPutItem(Item item, System.Collections.Generic.List<InvSlotType> allowedSlots = null)
public override bool TryPutItem(Item item, System.Collections.Generic.List<InvSlotType> allowedSlots = null, bool createNetworkEvent = true)
{
bool wasPut = base.TryPutItem(item, allowedSlots);
bool wasPut = base.TryPutItem(item, allowedSlots, createNetworkEvent);
if (wasPut)
{
@@ -66,9 +66,9 @@ namespace Barotrauma
return wasPut;
}
public override bool TryPutItem(Item item, int i, bool allowSwapping)
public override bool TryPutItem(Item item, int i, bool allowSwapping, bool createNetworkEvent = true)
{
bool wasPut = base.TryPutItem(item, i, allowSwapping);
bool wasPut = base.TryPutItem(item, i, allowSwapping, createNetworkEvent);
if (wasPut)
{