diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index b4ac02d5a..969339df7 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -101,7 +101,6 @@ - @@ -150,8 +149,6 @@ - - diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveCombat.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveCombat.cs index 5d4cf2216..17e7cc1f6 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveCombat.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveCombat.cs @@ -47,7 +47,7 @@ namespace Barotrauma { if (!character.SelectedItems.Contains(weapon)) { - character.Inventory.TryPutItem(weapon, 3, true, false); + character.Inventory.TryPutItem(weapon, 3, false); weapon.Equip(character); } character.CursorPosition = enemy.Position; diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs index b71c34a33..cad9038cc 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs @@ -60,7 +60,7 @@ namespace Barotrauma if (existingItem != null) existingItem.Drop(character); character.Inventory.RemoveItem(itemToContain); - container.Inventory.TryPutItem(itemToContain, null, false); + container.Inventory.TryPutItem(itemToContain, null); } else { diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs index ded80c299..ab2ce3af0 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs @@ -85,7 +85,7 @@ namespace Barotrauma if (character.Inventory.Items[i] == null) continue; //try to move the existing item to LimbSlot.Any and continue if successful - if (character.Inventory.TryPutItem(character.Inventory.Items[i], new List() { InvSlotType.Any }, false)) continue; + if (character.Inventory.TryPutItem(character.Inventory.Items[i], new List() { InvSlotType.Any })) continue; //if everything else fails, simply drop the existing item character.Inventory.Items[i].Drop(); @@ -97,7 +97,7 @@ namespace Barotrauma if (targetSlot > -1 && character.Inventory.IsInLimbSlot(targetItem, InvSlotType.Any)) { - character.Inventory.TryPutItem(targetItem, targetSlot, true, false); + character.Inventory.TryPutItem(targetItem, targetSlot, false); } } else diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 1ac256e32..d206ef057 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -591,7 +591,7 @@ namespace Barotrauma if (item == null) continue; item.Pick(this, true, true, true); - inventory.TryPutItem(item, i, false, false); + inventory.TryPutItem(item, i, false); } } } @@ -795,7 +795,7 @@ namespace Barotrauma { if (Vector2.Distance(selectedCharacter.WorldPosition, WorldPosition) > 300.0f || !selectedCharacter.CanBeSelected) { - DeselectCharacter(controlled == this); + DeselectCharacter(); } } @@ -944,16 +944,14 @@ namespace Barotrauma return closestCharacter; } - private void SelectCharacter(Character character, bool createNetworkEvent = true) + private void SelectCharacter(Character character) { if (character == null) return; selectedCharacter = character; - - if (createNetworkEvent) new NetworkEvent(NetworkEventType.SelectCharacter, ID, true, selectedCharacter.ID); } - private void DeselectCharacter(bool createNetworkEvent = true) + private void DeselectCharacter() { if (selectedCharacter == null) return; @@ -963,8 +961,6 @@ namespace Barotrauma } selectedCharacter = null; - - if (createNetworkEvent) new NetworkEvent(NetworkEventType.SelectCharacter, ID, true, (ushort)0); } /// @@ -1063,13 +1059,7 @@ namespace Barotrauma closestItem.IsHighlighted = true; if (!LockHands && closestItem.Pick(this)) { - new NetworkEvent(NetworkEventType.PickItem, ID, true, - new int[] - { - closestItem.ID, - IsKeyHit(InputType.Select) ? 1 : 0, - IsKeyHit(InputType.Use) ? 1 : 0 - }); + } } @@ -1077,7 +1067,7 @@ namespace Barotrauma { if (selectedCharacter != null) { - DeselectCharacter(controlled == this); + DeselectCharacter(); } else if (closestCharacter != null && closestCharacter.IsHumanoid && closestCharacter.CanBeSelected) { @@ -1087,7 +1077,7 @@ namespace Barotrauma } else { - if (selectedCharacter != null) DeselectCharacter(controlled==this); + if (selectedCharacter != null) DeselectCharacter(); selectedConstruction = null; closestItem = null; closestCharacter = null; @@ -1486,13 +1476,11 @@ namespace Barotrauma GameMain.NetworkMember.AddChatMessage(chatMessage, ChatMessageType.Dead); GameMain.LightManager.LosEnabled = false; controlled = null; - - new NetworkEvent(NetworkEventType.KillCharacter, ID, true, causeOfDeath); } //if it's an ai Character, only let the server kill it else if (GameMain.Server != null && this is AICharacter) { - new NetworkEvent(NetworkEventType.KillCharacter, ID, false, causeOfDeath); + } //don't kill the Character unless received a message about the Character dying else if (!isNetworkMessage) diff --git a/Subsurface/Source/Characters/CharacterHUD.cs b/Subsurface/Source/Characters/CharacterHUD.cs index 12e5c2cb1..a786a4901 100644 --- a/Subsurface/Source/Characters/CharacterHUD.cs +++ b/Subsurface/Source/Characters/CharacterHUD.cs @@ -107,9 +107,7 @@ namespace Barotrauma { limb.pullJoint.Enabled = false; } - - new NetworkEvent(NetworkEventType.SelectCharacter, Character.Controlled.ID, true, Character.Controlled.SelectedCharacter.ID); - + return true; }; } diff --git a/Subsurface/Source/Characters/HuskInfection.cs b/Subsurface/Source/Characters/HuskInfection.cs index dcd8243b0..7cb0cc0a0 100644 --- a/Subsurface/Source/Characters/HuskInfection.cs +++ b/Subsurface/Source/Characters/HuskInfection.cs @@ -175,7 +175,7 @@ namespace Barotrauma for (int i = 0; i < character.Inventory.Items.Length; i++) { if (character.Inventory.Items[i] == null) continue; - husk.Inventory.TryPutItem(character.Inventory.Items[i], i, false, true); + husk.Inventory.TryPutItem(character.Inventory.Items[i], i, true); } character.Enabled = false; diff --git a/Subsurface/Source/Characters/Jobs/Job.cs b/Subsurface/Source/Characters/Jobs/Job.cs index 05e85fed7..19c880656 100644 --- a/Subsurface/Source/Characters/Jobs/Job.cs +++ b/Subsurface/Source/Characters/Jobs/Job.cs @@ -112,11 +112,11 @@ namespace Barotrauma List allowedSlots = new List(item.AllowedSlots); allowedSlots.Remove(InvSlotType.Any); - character.Inventory.TryPutItem(item, allowedSlots, false); + character.Inventory.TryPutItem(item, allowedSlots); } else { - character.Inventory.TryPutItem(item, item.AllowedSlots, false); + character.Inventory.TryPutItem(item, item.AllowedSlots); } if (item.Prefab.Name == "ID Card" && spawnPoint != null) diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs index 795cf1dbf..cc27146d4 100644 --- a/Subsurface/Source/GameMain.cs +++ b/Subsurface/Source/GameMain.cs @@ -307,7 +307,7 @@ namespace Barotrauma } else { - NetworkEvent.Events.Clear(); + } GUI.Update((float)deltaTime); @@ -351,13 +351,6 @@ namespace Barotrauma } static bool waitForKeyHit = true; - public static CoroutineHandle ShowLoading(IEnumerable loader, bool waitKeyHit = true) - { - waitForKeyHit = waitKeyHit; - titleScreenOpen = true; - TitleScreen.LoadState = null; - return CoroutineManager.StartCoroutine(TitleScreen.DoLoading(loader)); - } protected override void OnExiting(object sender, EventArgs args) { diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index 780cb452c..3d57b716f 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -100,7 +100,6 @@ namespace Barotrauma ushort itemID = Items[slotIndex].ID; Items[slotIndex].ApplyStatusEffects(ActionType.OnUse, 1.0f, character); - new NetworkEvent(NetworkEventType.ApplyStatusEffect, character.ID, true, itemID); return true; } @@ -142,7 +141,7 @@ namespace Barotrauma /// /// If there is room, puts the item in the inventory and returns true, otherwise returns false /// - public override bool TryPutItem(Item item, List allowedSlots = null, bool createNetworkEvent = true) + public override bool TryPutItem(Item item, List allowedSlots = null) { if (allowedSlots == null || ! allowedSlots.Any()) return false; @@ -153,7 +152,7 @@ namespace Barotrauma { if (Items[i] != null || limbSlots[i] != InvSlotType.Any) continue; - PutItem(item, i, createNetworkEvent); + PutItem(item, i); item.Unequip(character); return true; } @@ -179,7 +178,7 @@ namespace Barotrauma { if (allowedSlot.HasFlag(limbSlots[i]) && Items[i] == null) { - PutItem(item, i, createNetworkEvent, !placed); + PutItem(item, i, !placed); item.Equip(character); placed = true; } @@ -195,7 +194,7 @@ namespace Barotrauma return placed; } - public override bool TryPutItem(Item item, int index, bool allowSwapping, bool createNetworkEvent) + public override bool TryPutItem(Item item, int index, bool allowSwapping) { //there's already an item in the slot if (Items[index] != null) @@ -208,9 +207,9 @@ namespace Barotrauma System.Diagnostics.Debug.Assert(Items[index] != null); Inventory otherInventory = Items[index].ParentInventory; - if (otherInventory != null && otherInventory.Owner!=null && createNetworkEvent) + if (otherInventory != null && otherInventory.Owner!=null) { - new Networking.NetworkEvent(Networking.NetworkEventType.InventoryUpdate, otherInventory.Owner.ID, true, true); + } combined = true; @@ -225,10 +224,10 @@ 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, false) && - TryPutItem(item, index, false, false)) + if (TryPutItem(existingItem, currentIndex, false) && + TryPutItem(item, index, false)) { - new Networking.NetworkEvent(Networking.NetworkEventType.InventoryUpdate, Owner.ID, true, true); + } else { @@ -250,7 +249,7 @@ namespace Barotrauma if (!item.AllowedSlots.Contains(InvSlotType.Any)) return false; if (Items[index] != null) return Items[index] == item; - PutItem(item, index, createNetworkEvent, true); + PutItem(item, index, true); return true; } @@ -276,7 +275,7 @@ namespace Barotrauma if (!slotsFree) return false; - return TryPutItem(item, new List() {placeToSlots}, createNetworkEvent); + return TryPutItem(item, new List() {placeToSlots}); } public void DrawOwn(SpriteBatch spriteBatch, Vector2 offset) @@ -492,8 +491,7 @@ namespace Barotrauma else { DropItem(draggingItem); - - new NetworkEvent(NetworkEventType.DropItem, draggingItem.ID, true); + //draggingItem = null; } } diff --git a/Subsurface/Source/Items/Components/Holdable/Pickable.cs b/Subsurface/Source/Items/Components/Holdable/Pickable.cs index 13286a5e4..bfa903521 100644 --- a/Subsurface/Source/Items/Components/Holdable/Pickable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Pickable.cs @@ -63,17 +63,7 @@ namespace Barotrauma.Items.Components if (PickingTime>0.0f) { CoroutineManager.StartCoroutine(WaitForPick(picker, PickingTime)); - - //create a networkevent here, because the item doesn't count as picked yet and the character won't create one - new NetworkEvent(NetworkEventType.PickItem, picker.ID, true, - new int[] - { - item.ID, - picker.IsKeyHit(InputType.Select) ? 1 : 0, - picker.IsKeyHit(InputType.Use) ? 1 : 0 - }); - return false; } else @@ -86,7 +76,7 @@ namespace Barotrauma.Items.Components private bool OnPicked(Character picker) { - if (picker.Inventory.TryPutItem(item, allowedSlots, picker == Character.Controlled)) + if (picker.Inventory.TryPutItem(item, allowedSlots)) { if (!picker.HasSelectedItem(item) && item.body != null) item.body.Enabled = false; this.picker = picker; diff --git a/Subsurface/Source/Items/Components/ItemContainer.cs b/Subsurface/Source/Items/Components/ItemContainer.cs index a31430cc7..35383b3fd 100644 --- a/Subsurface/Source/Items/Components/ItemContainer.cs +++ b/Subsurface/Source/Items/Components/ItemContainer.cs @@ -253,7 +253,7 @@ namespace Barotrauma.Items.Components Item item = MapEntity.FindEntityByID(itemIds[i]) as Item; if (item == null) continue; - Inventory.TryPutItem(item, i, false, false); + Inventory.TryPutItem(item, i, false); } itemIds = null; diff --git a/Subsurface/Source/Items/FixRequirement.cs b/Subsurface/Source/Items/FixRequirement.cs index e0884310a..c5574038a 100644 --- a/Subsurface/Source/Items/FixRequirement.cs +++ b/Subsurface/Source/Items/FixRequirement.cs @@ -141,9 +141,7 @@ namespace Barotrauma Item item = frame.UserData as Item; if (item == null) return true; - - new NetworkEvent(NetworkEventType.ItemFixed, item.ID, true, (byte)item.FixRequirements.IndexOf(requirement) ); - + return true; } diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 1a856ac36..a8ccb6de3 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -93,21 +93,21 @@ namespace Barotrauma /// /// If there is room, puts the item in the inventory and returns true, otherwise returns false /// - public virtual bool TryPutItem(Item item, List allowedSlots = null, bool createNetworkEvent = true) + public virtual bool TryPutItem(Item item, List allowedSlots = null) { int slot = FindAllowedSlot(item); if (slot < 0) return false; - PutItem(item, slot, createNetworkEvent); + PutItem(item, slot); return true; } - public virtual bool TryPutItem(Item item, int i, bool allowSwapping, bool createNetworkEvent) + public virtual bool TryPutItem(Item item, int i, bool allowSwapping) { if (Owner == null) return false; if (CanBePut(item,i)) { - PutItem(item, i, createNetworkEvent); + PutItem(item, i); return true; } else @@ -116,7 +116,7 @@ namespace Barotrauma } } - protected void PutItem(Item item, int i, bool createNetworkEvent, bool removeItem = true) + protected void PutItem(Item item, int i, bool removeItem = true) { if (Owner == null) return; @@ -132,8 +132,6 @@ namespace Barotrauma { item.body.Enabled = false; } - - if (createNetworkEvent) new NetworkEvent(NetworkEventType.InventoryUpdate, Owner.ID, true, true); } public Item FindItem(string itemName) @@ -216,7 +214,7 @@ namespace Barotrauma { if (Owner!=null) { - new NetworkEvent(NetworkEventType.InventoryUpdate, Owner.ID, true); + } DropItem(draggingItem); diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index de9e885c5..84adfe5a9 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -165,8 +165,6 @@ namespace Barotrauma condition = MathHelper.Clamp(value, 0.0f, 100.0f); if (condition == 0.0f && prev>0.0f) { - new NetworkEvent(this.ID, false); - ApplyStatusEffects(ActionType.OnBroken, 1.0f, null); foreach (FixRequirement req in FixRequirements) { @@ -719,7 +717,7 @@ namespace Barotrauma Vector2 moveAmount = body.SimPosition - body.LastSentPosition; if (parentInventory == null && moveAmount != Vector2.Zero && moveAmount.Length() > NetConfig.ItemPosUpdateDistance) { - new NetworkEvent(NetworkEventType.PhysicsBodyPosition, ID, false); + } Vector2 displayPos = ConvertUnits.ToDisplayUnits(body.SimPosition); @@ -784,7 +782,6 @@ namespace Barotrauma if (ImpactTolerance > 0.0f && impact > ImpactTolerance) { ApplyStatusEffects(ActionType.OnImpact, 1.0f); - new NetworkEvent(NetworkEventType.ApplyStatusEffect, this.ID, false, ActionType.OnImpact); } var containedItems = ContainedItems; @@ -1384,7 +1381,7 @@ namespace Barotrauma return isCombined; } - public void Drop(Character dropper = null, bool createNetworkEvent = true) + public void Drop(Character dropper = null) { //if (dropper == Character.Controlled) // new NetworkEvent(NetworkEventType.DropItem, ID, true); @@ -1450,9 +1447,7 @@ namespace Barotrauma if (objectProperty.TrySetValue(text)) { textBox.Text = text; - - new NetworkEvent(NetworkEventType.UpdateProperty, ID, true, objectProperty.Name); - + return true; } else @@ -1620,9 +1615,6 @@ namespace Barotrauma public void NewComponentEvent(ItemComponent ic, bool isClient, bool isImportant) { int index = components.IndexOf(ic); - - new NetworkEvent(isImportant ? - NetworkEventType.ImportantComponentUpdate : NetworkEventType.ComponentUpdate, ID, isClient, index); } public override void Remove() diff --git a/Subsurface/Source/Items/ItemInventory.cs b/Subsurface/Source/Items/ItemInventory.cs index fe714d58e..d2fd5c567 100644 --- a/Subsurface/Source/Items/ItemInventory.cs +++ b/Subsurface/Source/Items/ItemInventory.cs @@ -44,9 +44,9 @@ namespace Barotrauma return (item!=null && Items[i]==null && container.CanBeContained(item)); } - public override bool TryPutItem(Item item, int i, bool allowSwapping, bool createNetworkEvent) + public override bool TryPutItem(Item item, int i, bool allowSwapping) { - bool wasPut = base.TryPutItem(item, i, allowSwapping, createNetworkEvent); + bool wasPut = base.TryPutItem(item, i, allowSwapping); if (wasPut) { diff --git a/Subsurface/Source/Items/ItemSpawner.cs b/Subsurface/Source/Items/ItemSpawner.cs index 37ae49de1..9109d17a5 100644 --- a/Subsurface/Source/Items/ItemSpawner.cs +++ b/Subsurface/Source/Items/ItemSpawner.cs @@ -74,7 +74,7 @@ namespace Barotrauma AddToSpawnedList(item); var inventory = (Inventory)itemInfo.Second; - inventory.TryPutItem(item, null, false); + inventory.TryPutItem(item, null); items.Add(item); //inventories.Add(inventory); diff --git a/Subsurface/Source/Map/FireSource.cs b/Subsurface/Source/Map/FireSource.cs index 2f8fbc1c2..24a0102b0 100644 --- a/Subsurface/Source/Map/FireSource.cs +++ b/Subsurface/Source/Map/FireSource.cs @@ -61,10 +61,10 @@ namespace Barotrauma get { return hull; } } - public FireSource(Vector2 worldPosition, Hull spawningHull = null, bool networkEvent=false) + public FireSource(Vector2 worldPosition, Hull spawningHull = null) { hull = Hull.FindHull(worldPosition, spawningHull); - if (hull == null || (!networkEvent && GameMain.Client!=null)) return; + if (hull == null || (GameMain.Client!=null)) return; if (fireSoundBasic==null) { @@ -72,7 +72,7 @@ namespace Barotrauma fireSoundLarge = Sound.Load("Content/Sounds/firelarge.ogg"); } - hull.AddFireSource(this, !networkEvent); + hull.AddFireSource(this); Submarine = hull.Submarine; @@ -338,9 +338,9 @@ namespace Barotrauma if (size.X < 1.0f) Remove(); } - public void Remove(bool isNetworkEvent = false) + public void Remove() { - if (!isNetworkEvent && GameMain.Client != null) return; + if (GameMain.Client != null) return; lightSource.Remove(); diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index bf0e483d4..e73219af8 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -343,13 +343,9 @@ namespace Barotrauma } - public void AddFireSource(FireSource fireSource, bool createNetworkEvent = true) + public void AddFireSource(FireSource fireSource) { fireSources.Add(fireSource); - if (createNetworkEvent) - { - new Networking.NetworkEvent(Networking.NetworkEventType.ImportantEntityUpdate, this.ID, false); - } } public override void Update(Camera cam, float deltaTime) @@ -446,7 +442,7 @@ namespace Barotrauma if (Math.Abs(lastSentVolume - volume) > FullVolume * 0.1f || Math.Abs(lastSentOxygen - OxygenPercentage) > 5f) { - new Networking.NetworkEvent(ID, false); + } if (!update) @@ -545,7 +541,6 @@ namespace Barotrauma public void RemoveFire(FireSource fire) { fireSources.Remove(fire); - new Networking.NetworkEvent(Networking.NetworkEventType.ImportantEntityUpdate, this.ID, false); } public override void Draw(SpriteBatch spriteBatch, bool editing, bool back = true) diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index 1a855f010..4d5e2dc5e 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -572,7 +572,6 @@ namespace Barotrauma if (damage != sections[sectionIndex].damage && Math.Abs(sections[sectionIndex].lastSentDamage - damage)>5.0f) { - new NetworkEvent(NetworkEventType.ImportantEntityUpdate, ID, false); //sections[sectionIndex].lastSentDamage = damage; } diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 8d4f015bd..aeb5d83e3 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -474,7 +474,6 @@ namespace Barotrauma if (networkUpdateTimer < 0.0f) { - new Networking.NetworkEvent(ID, false); networkUpdateTimer = 1.0f; } diff --git a/Subsurface/Source/Networking/Client.cs b/Subsurface/Source/Networking/Client.cs index 41bdbac6d..c80d208e1 100644 --- a/Subsurface/Source/Networking/Client.cs +++ b/Subsurface/Source/Networking/Client.cs @@ -42,9 +42,7 @@ namespace Barotrauma.Networking public List jobPreferences; public JobPrefab assignedJob; - - public FileStreamSender FileStreamSender; - + public float deleteDisconnectedTimer; public ClientPermissions Permissions; @@ -168,17 +166,6 @@ namespace Barotrauma.Networking client.kickVoters.RemoveAll(voter => !connectedClients.Contains(voter)); } } - - public void CancelTransfer() - { - if (FileStreamSender == null) return; - - FileStreamSender.CancelTransfer(); - FileStreamSender.Dispose(); - - FileStreamSender = null; - } - - + } } diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 5ad890008..14e90e8d2 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -16,10 +16,7 @@ namespace Barotrauma.Networking private NetClient client; private GUIMessageBox reconnectBox; - - private FileStreamReceiver fileStreamReceiver; - private Queue> requestFileQueue; - + private GUIButton endRoundButton; private GUITickBox endVoteTickBox; @@ -45,12 +42,7 @@ namespace Barotrauma.Networking return otherClients; } } - - public string ActiveFileTransferName - { - get { return (fileStreamReceiver == null || fileStreamReceiver.Status == FileTransferStatus.Finished) ? "" : fileStreamReceiver.FileName; } - } - + public GameClient(string newName) { endVoteTickBox = new GUITickBox(new Rectangle(GameMain.GraphicsWidth - 170, 20, 20, 20), "End round", Alignment.TopLeft, inGameHUD); @@ -76,9 +68,7 @@ namespace Barotrauma.Networking Hull.EditWater = false; name = newName; - - requestFileQueue = new Queue>(); - + characterInfo = new CharacterInfo(Character.HumanConfigFile, name); characterInfo.Job = null; @@ -125,8 +115,7 @@ namespace Barotrauma.Networking netPeer = client; client.Start(); - NetOutgoingMessage outmsg = client.CreateMessage(); - outmsg.Write((byte)PacketTypes.Login); + NetOutgoingMessage outmsg = client.CreateMessage(); System.Net.IPEndPoint IPEndPoint = null; @@ -326,16 +315,14 @@ namespace Barotrauma.Networking } else if (gameStarted) { - new NetworkEvent(NetworkEventType.EntityUpdate, myCharacter.ID, true); + } } // Update current time updateTimer = DateTime.Now + updateInterval; } - - private CoroutineHandle startGameCoroutine; - + /// /// Check for new incoming messages from server /// @@ -343,14 +330,6 @@ namespace Barotrauma.Networking { // Create new incoming message holder NetIncomingMessage inc; - - if (startGameCoroutine != null && CoroutineManager.IsCoroutineRunning(startGameCoroutine)) return; - - if (fileStreamReceiver == null && requestFileQueue.Count > 0) - { - var newRequest = requestFileQueue.Dequeue(); - RequestFile(newRequest.First, newRequest.Second); - } while ((inc = client.ReadMessage()) != null) { @@ -586,96 +565,7 @@ namespace Barotrauma.Networking return true; } - - public void RequestFile(string file, FileTransferMessageType fileType) - { - if (fileStreamReceiver!=null) - { - var request = new Pair() - { - First = file, - Second = fileType - }; - - requestFileQueue.Enqueue(request); - return; - } - - NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.RequestFile); - msg.Write((byte)fileType); - - msg.Write(file); - - client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); - - fileStreamReceiver = new FileStreamReceiver(client, Path.Combine(Submarine.SavePath, "Downloaded"), fileType, OnFileReceived); - } - - private void OnFileReceived(FileStreamReceiver receiver) - { - if (receiver.Status == FileTransferStatus.Error) - { - new GUIMessageBox("Error while receiving file from server", receiver.ErrorMessage, 400, 350); - receiver.DeleteFile(); - - } - else if (receiver.Status == FileTransferStatus.Finished) - { - new GUIMessageBox("Download finished", "File ''" + receiver.FileName + "'' was downloaded succesfully."); - - switch (receiver.FileType) - { - case FileTransferMessageType.Submarine: - Submarine.SavedSubmarines.RemoveAll(s => s.Name + ".sub" == receiver.FileName); - - for (int i = 0; i<2; i++) - { - - var textBlock = (i == 0) ? - GameMain.NetLobbyScreen.ShuttleList.ListBox.children.Find(c => (c.UserData as Submarine).Name+".sub" == receiver.FileName) : - GameMain.NetLobbyScreen.SubList.children.Find(c => (c.UserData as Submarine).Name+".sub" == receiver.FileName); - if (textBlock == null) continue; - - (textBlock as GUITextBlock).TextColor = Color.White; - - var newSub = new Submarine(receiver.FilePath); - Submarine.SavedSubmarines.Add(newSub); - textBlock.UserData = newSub; - } - - break; - } - } - - fileStreamReceiver = null; - } - - private void CancelFileTransfer() - { - fileStreamReceiver.DeleteFile(); - fileStreamReceiver.Dispose(); - fileStreamReceiver = null; - - NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.RequestFile); - msg.Write((byte)FileTransferMessageType.Cancel); - client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); - } - - public override void KickPlayer(string kickedName, bool ban) - { - if (!permissions.HasFlag(ClientPermissions.Kick) && !ban) return; - if (!permissions.HasFlag(ClientPermissions.Ban) && ban) return; - - NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.KickPlayer); - msg.Write(ban); - msg.Write(kickedName); - - client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); - } - + public bool VoteForKick(GUIButton button, object userdata) { var votedClient = otherClients.Find(c => c.Character == userdata); @@ -695,7 +585,7 @@ namespace Barotrauma.Networking public void Vote(VoteType voteType, object userData) { NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.Vote); + msg.Write((byte)voteType); switch (voteType) @@ -723,7 +613,7 @@ namespace Barotrauma.Networking public bool SpectateClicked(GUIButton button, object userData) { NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.SpectateRequest); + client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); @@ -754,7 +644,6 @@ namespace Barotrauma.Networking if (characterInfo == null) return; NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.CharacterInfo); msg.Write(characterInfo.Name); msg.Write(characterInfo.Gender == Gender.Male); diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 9847a7479..38b83ec21 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -351,8 +351,6 @@ namespace Barotrauma.Networking foreach (Client c in connectedClients) { - if (c.FileStreamSender != null) UpdateFileTransfer(c, deltaTime); - //c.ReliableChannel.Update(deltaTime); //slowly reset spam timers @@ -365,7 +363,7 @@ namespace Barotrauma.Networking { try { - ReadMessage(inc); + } catch (Exception e) { @@ -382,7 +380,6 @@ namespace Barotrauma.Networking { if (gameStarted) { - if (myCharacter != null && !myCharacter.IsDead) new NetworkEvent(NetworkEventType.EntityUpdate, myCharacter.ID, false); float ignoreDistance = FarseerPhysics.ConvertUnits.ToDisplayUnits(NetConfig.CharacterIgnoreDistance); @@ -394,7 +391,7 @@ namespace Barotrauma.Networking c2 => c2.IsNetworkPlayer && Vector2.Distance(c2.WorldPosition, c.WorldPosition) < ignoreDistance)) { - new NetworkEvent(NetworkEventType.EntityUpdate, c.ID, false); + } //todo: take multiple subs into account @@ -407,8 +404,7 @@ namespace Barotrauma.Networking if (server.ConnectionsCount > 0) { if (sparseUpdateTimer < DateTime.Now) SparseUpdate(); - - SendNetworkEvents(); + } updateTimer = DateTime.Now + updateInterval; @@ -444,557 +440,12 @@ namespace Barotrauma.Networking //if (FarseerPhysics.ConvertUnits.ToSimUnits(diff.Length()) > NetConfig.CharacterIgnoreDistance) continue; } - - new NetworkEvent(NetworkEventType.ImportantEntityUpdate, c.ID, false); + } sparseUpdateTimer = DateTime.Now + sparseUpdateInterval; } - - private void ReadMessage(NetIncomingMessage inc) - { - Client sender = connectedClients.Find(x => x.Connection == inc.SenderConnection); - - switch (inc.MessageType) - { - case NetIncomingMessageType.ConnectionApproval: - HandleConnectionApproval(inc); - break; - case NetIncomingMessageType.StatusChanged: - Debug.WriteLine(inc.SenderConnection + " status changed. " + (NetConnectionStatus)inc.SenderConnection.Status); - if (inc.SenderConnection.Status == NetConnectionStatus.Disconnected) - { - var connectedClient = connectedClients.Find(c => c.Connection == inc.SenderConnection); - if (connectedClient != null && !disconnectedClients.Contains(connectedClient)) - { - connectedClient.deleteDisconnectedTimer = NetConfig.DeleteDisconnectedTime; - disconnectedClients.Add(connectedClient); - } - - DisconnectClient(inc.SenderConnection, - connectedClient != null ? connectedClient.name + " has disconnected" : ""); - } - break; - case NetIncomingMessageType.Data: - - byte packetType = inc.ReadByte(); - - if (sender == null) - { - var authUser = unauthenticatedClients.Find(c => c.Connection == inc.SenderConnection); - if (authUser == null) - { - unauthenticatedClients.Remove(authUser); - inc.SenderConnection.Disconnect("Disconnected"); - } - else - { - CheckAuthentication(inc); - } - return; - } - - switch (packetType) - { - case (byte)PacketTypes.NetworkEvent: - if (!gameStarted) break; - NetworkEvent.ReadMessage(inc, true); - - break; - case (byte)PacketTypes.Chatmessage: - ReadChatMessage(inc); - break; - case (byte)PacketTypes.PlayerLeft: - DisconnectClient(inc.SenderConnection); - break; - case (byte)PacketTypes.StartGame: - sender.ReadyToStart = true; - break; - case (byte)PacketTypes.EndGame: - if (!sender.HasPermission(ClientPermissions.EndRound)) - { - Log(sender.name+" attempted to end the round (insufficient permissions)", Color.Red); - } - else - { - Log("Round ended by " + sender.name, Color.Red); - EndGame(); - } - break; - case (byte)PacketTypes.KickPlayer: - bool ban = inc.ReadBoolean(); - string kickedName = inc.ReadString(); - - var kickedClient = connectedClients.Find(c => c.name.ToLowerInvariant() == kickedName.ToLowerInvariant()); - if (kickedClient == null || kickedClient == sender) return; - - if (ban && !sender.HasPermission(ClientPermissions.Ban)) - { - Log(sender.name + " attempted to ban " + kickedClient.name + " (insufficient permissions)", Color.Red); - - } - else if (!sender.HasPermission(ClientPermissions.Kick)) - { - Log(sender.name + " attempted to kick " + kickedClient.name + " (insufficient permissions)", Color.Red); - } - else - { - KickClient(kickedClient, ban); - } - break; - case (byte)PacketTypes.CharacterInfo: - ReadCharacterData(inc); - break; - case (byte)PacketTypes.RequestFile: - - if (!AllowFileTransfers) - { - SendCancelTransferMessage(sender, "File transfers have been disabled by the server."); - break; - } - - byte fileType = inc.ReadByte(); - string fileName = fileType == (byte)FileTransferMessageType.Cancel ? "" : inc.ReadString(); - - switch (fileType) - { - case (byte)FileTransferMessageType.Submarine: - - var requestedSubmarine = Submarine.SavedSubmarines.Find(s => s.Name == fileName); - - if (requestedSubmarine==null) - { - //todo: ei voi ladata - } - else - { - if (sender.FileStreamSender != null) sender.FileStreamSender.CancelTransfer(); - - var fileStreamSender = FileStreamSender.Create(sender.Connection, requestedSubmarine.FilePath, FileTransferMessageType.Submarine); - if (fileStreamSender != null) sender.FileStreamSender = fileStreamSender; - } - break; - case (byte)FileTransferMessageType.Cancel: - if (sender.FileStreamSender != null) - { - sender.FileStreamSender.CancelTransfer(); - } - break; - default: - DebugConsole.ThrowError("Unknown file type was requested ("+fileType+")"); - break; - } - - break; - case (byte)PacketTypes.ResendRequest: - break; - case (byte)PacketTypes.LatestMessageID: - break; - case (byte)PacketTypes.Vote: - Voting.RegisterVote(inc, connectedClients); - - if (Voting.AllowEndVoting && EndVoteMax > 0 && - ((float)EndVoteCount / (float)EndVoteMax) >= EndVoteRequiredRatio) - { - Log("Ending round by votes (" + EndVoteCount + "/" + (EndVoteMax - EndVoteCount) + ")", Color.Cyan); - EndGame(); - } - break; - case (byte)PacketTypes.RequestNetLobbyUpdate: - UpdateNetLobby(null, null); - UpdateVoteStatus(); - break; - case (byte)PacketTypes.SpectateRequest: - if (gameStarted && AllowSpectating) - { - var startMessage = CreateStartMessage(roundStartSeed, Submarine.MainSub, GameMain.GameSession.gameMode.Preset); - server.SendMessage(startMessage, inc.SenderConnection, NetDeliveryMethod.ReliableOrdered); - - CoroutineManager.StartCoroutine(SyncSpectator(sender)); - } - break; - } - break; - case NetIncomingMessageType.WarningMessage: - Debug.WriteLine(inc.ReadString()); - break; - } - } - - private void SendMessage(NetOutgoingMessage msg, NetDeliveryMethod deliveryMethod, NetConnection excludedConnection = null) - { - List recipients = new List(); - - foreach (Client client in connectedClients) - { - if (client.Connection != excludedConnection) recipients.Add(client.Connection); - } - - if (recipients.Count == 0) return; - - SendMessage(msg, deliveryMethod, recipients); - } - - private void SendMessage(NetOutgoingMessage msg, NetDeliveryMethod deliveryMethod, List recipients) - { - if (recipients == null) recipients = connectedClients.Select(c => c.Connection).ToList(); - - if (recipients.Count == 0) return; - - server.SendMessage(msg, recipients, deliveryMethod, 0); - } - - private void SendNetworkEvents(List recipients = null) - { - if (NetworkEvent.Events.Count == 0) return; - - if (recipients == null) - { - recipients = connectedClients.FindAll(c => c.inGame); - } - - if (recipients.Count == 0) return; - - foreach (Client c in recipients) - { - var message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLidgren, c.Connection); - if (message!=null) - { - server.SendMessage(message, c.Connection, NetDeliveryMethod.ReliableUnordered); - } - - message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.Unreliable, c.Connection); - if (message != null) - { - server.SendMessage(message, c.Connection, NetDeliveryMethod.Unreliable, 0); - } - } - - NetworkEvent.Events.Clear(); - } - - private IEnumerable SyncSpectator(Client sender) - { - yield return new WaitForSeconds(3.0f); - - foreach (Item item in Item.Remover.removedItems) - { - Item.Spawner.spawnItems.Remove(item); - } - - SendItemRemoveMessage(Item.Remover.removedItems, new List() { sender.Connection }); - SendItemSpawnMessage(Item.Spawner.spawnItems, new List() { sender.Connection }); - - yield return new WaitForSeconds(1.0f); - - //save all the current events to a list and clear them - var existingEvents = new List(NetworkEvent.Events); - NetworkEvent.Events.Clear(); - - - foreach (Hull hull in Hull.hullList) - { - if (!hull.FireSources.Any() && hull.Volume < 0.01f) continue; - new NetworkEvent(NetworkEventType.ImportantEntityUpdate, hull.ID, false); - } - - foreach (Character c in Character.CharacterList) - { - new NetworkEvent(NetworkEventType.EntityUpdate, c.ID, false); - if (c.Inventory != null) new NetworkEvent(NetworkEventType.InventoryUpdate, c.ID, false); - if (c.IsDead) new NetworkEvent(NetworkEventType.KillCharacter, c.ID, false); - } - - foreach (Structure wall in Structure.WallList) - { - bool takenDamage = false; - for (int i = 0; i syncMessages = new List(NetworkEvent.Events); - while (syncMessages.Any()) - { - //put 5 events in the message and send them to the spectator - NetworkEvent.Events = syncMessages.GetRange(0, Math.Min(syncMessages.Count, 5)); - SendNetworkEvents(new List() { sender }); - syncMessages.RemoveRange(0, Math.Min(syncMessages.Count, 5)); - - //restore "normal" events - NetworkEvent.Events = existingEvents; - - yield return new WaitForSeconds(0.1f); - - //save "normal" events again - existingEvents = new List(NetworkEvent.Events); - } - - yield return new WaitForSeconds(0.1f); - - SendRespawnManagerMsg(null, null, new List() { sender.Connection }); - - yield return new WaitForSeconds(0.1f); - - - sender.inGame = true; - - yield return CoroutineStatus.Success; - } - - - public bool StartGameClicked(GUIButton button, object obj) - { - Submarine selectedSub = null; - Submarine selectedShuttle = GameMain.NetLobbyScreen.SelectedShuttle; - - if (Voting.AllowSubVoting) - { - selectedSub = Voting.HighestVoted(VoteType.Sub, connectedClients); - if (selectedSub == null) selectedSub = GameMain.NetLobbyScreen.SelectedSub; - } - else - { - selectedSub = GameMain.NetLobbyScreen.SelectedSub; - } - - if (selectedSub == null) - { - GameMain.NetLobbyScreen.SubList.Flash(); - return false; - } - - if (selectedShuttle == null) - { - GameMain.NetLobbyScreen.ShuttleList.Flash(); - return false; - } - - GameModePreset selectedMode = Voting.HighestVoted(VoteType.Mode, connectedClients); - if (selectedMode == null) selectedMode = GameMain.NetLobbyScreen.SelectedMode; - - if (selectedMode==null) - { - GameMain.NetLobbyScreen.ModeList.Flash(); - return false; - } - - CoroutineManager.StartCoroutine(WaitForPlayersReady(selectedSub, selectedShuttle, selectedMode), "WaitForPlayersReady"); - - return true; - } - - private IEnumerable WaitForPlayersReady(Submarine selectedSub, Submarine selectedShuttle, GameModePreset selectedMode) - { - GameMain.NetLobbyScreen.StartButton.Enabled = false; - - NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.CanStartGame); - msg.Write(selectedSub.Name); - msg.Write(selectedSub.MD5Hash.Hash); - - msg.Write(selectedShuttle.Name); - msg.Write(selectedShuttle.MD5Hash.Hash); - - SendMessage(msg, NetDeliveryMethod.ReliableUnordered); - - connectedClients.ForEach(c => c.ReadyToStart = false); - - float waitForResponseTimer = 5.0f; - while (connectedClients.Any(c => !c.ReadyToStart) && waitForResponseTimer > 0.0f) - { - waitForResponseTimer -= CoroutineManager.UnscaledDeltaTime; - yield return CoroutineStatus.Running; - } - - float fileTransferTimeOut = 60.0f; - while (connectedClients.Any(c => c.FileStreamSender != null && c.FileStreamSender.FilePath == selectedSub.FilePath) && fileTransferTimeOut>0.0f) - { - fileTransferTimeOut -= CoroutineManager.UnscaledDeltaTime; - - if (GUIMessageBox.MessageBoxes.Count==0) - { - var messageBox = new GUIMessageBox("File transfer in progress", - "The round will be started after the submarine file has been sent to all players.", new string[] {"Cancel transfer"}, 400, 400); - messageBox.Buttons[0].UserData = connectedClients.Find(c => c.FileStreamSender != null && c.FileStreamSender.FilePath == selectedSub.FilePath); - messageBox.Buttons[0].OnClicked = (button, obj) => - { - (button.UserData as Client).CancelTransfer(); - return true; - }; - } - } - - GameMain.ShowLoading(StartGame(selectedSub, selectedShuttle, selectedMode), false); - - yield return CoroutineStatus.Success; - } - private IEnumerable StartGame(Submarine selectedSub, Submarine selectedShuttle, GameModePreset selectedMode) - { - Item.Spawner.Clear(); - Item.Remover.Clear(); - - GameMain.NetLobbyScreen.StartButton.Enabled = false; - - GUIMessageBox.CloseAll(); - - AssignJobs(connectedClients); - - roundStartSeed = DateTime.Now.Millisecond; - Rand.SetSyncedSeed(roundStartSeed); - - GameMain.GameSession = new GameSession(selectedSub, "", selectedMode, Mission.MissionTypes[GameMain.NetLobbyScreen.MissionTypeIndex]); - GameMain.GameSession.StartShift(GameMain.NetLobbyScreen.LevelSeed); - - GameServer.Log("Starting a new round...", Color.Cyan); - GameServer.Log("Submarine: " + selectedSub.Name, Color.Cyan); - GameServer.Log("Game mode: " + selectedMode.Name, Color.Cyan); - GameServer.Log("Level seed: " + GameMain.NetLobbyScreen.LevelSeed, Color.Cyan); - - if (AllowRespawn) respawnManager = new RespawnManager(this, selectedShuttle); - - yield return CoroutineStatus.Running; - - List characterInfos = new List(); - - foreach (Client client in connectedClients) - { - client.inGame = true; - - if (client.characterInfo == null) - { - client.characterInfo = new CharacterInfo(Character.HumanConfigFile, client.name); - } - characterInfos.Add(client.characterInfo); - - client.characterInfo.Job = new Job(client.assignedJob); - } - - if (characterInfo != null) - { - characterInfo.Job = new Job(GameMain.NetLobbyScreen.JobPreferences[0]); - characterInfos.Add(characterInfo); - } - - WayPoint[] assignedWayPoints = WayPoint.SelectCrewSpawnPoints(characterInfos, Submarine.MainSub); - - for (int i = 0; i < connectedClients.Count; i++) - { - connectedClients[i].Character = Character.Create( - connectedClients[i].characterInfo, assignedWayPoints[i].WorldPosition, true, false); - connectedClients[i].Character.GiveJobItems(assignedWayPoints[i]); - - GameMain.GameSession.CrewManager.characters.Add(connectedClients[i].Character); - } - - if (characterInfo != null) - { - myCharacter = Character.Create(characterInfo, assignedWayPoints[assignedWayPoints.Length - 1].WorldPosition, false, false); - Character.Controlled = myCharacter; - - myCharacter.GiveJobItems(assignedWayPoints[assignedWayPoints.Length - 1]); - - GameMain.GameSession.CrewManager.characters.Add(myCharacter); - } - - var startMessage = CreateStartMessage(roundStartSeed, Submarine.MainSub, GameMain.GameSession.gameMode.Preset); - - SendMessage(startMessage, NetDeliveryMethod.ReliableOrdered); - - //SendItemSpawnMessage(allItems, inventories); - - yield return CoroutineStatus.Running; - - UpdateCrewFrame(); - - if (TraitorsEnabled == YesNoMaybe.Yes || - (TraitorsEnabled == YesNoMaybe.Maybe && Rand.Range(0.0f, 1.0f) < 0.5f)) - { - TraitorManager = new TraitorManager(this); - } - else - { - TraitorManager = null; - } - - //give some time for the clients to load the map - yield return new WaitForSeconds(2.0f); - - gameStarted = true; - - GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; - - GameMain.GameScreen.Select(); - - if (myCharacter == null) - { - AddChatMessage("Press TAB to chat. Use ''d;'' to talk to dead players and spectators, " - + "and ''player name;'' to only send the message to a specific player.", ChatMessageType.Server); - } - else - { - AddChatMessage("Press TAB to chat. Use ''r;'' to talk through the radio.", ChatMessageType.Server); - } - - GameMain.NetLobbyScreen.StartButton.Enabled = true; - - yield return CoroutineStatus.Success; - } - - private NetOutgoingMessage CreateStartMessage(int seed, Submarine selectedSub, GameModePreset selectedMode) - { - NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.StartGame); - - msg.Write(seed); - - msg.Write(GameMain.NetLobbyScreen.LevelSeed); - - msg.Write((byte)GameMain.NetLobbyScreen.MissionTypeIndex); - - msg.Write(selectedSub.Name); - msg.Write(selectedSub.MD5Hash.Hash); - - msg.Write(GameMain.NetLobbyScreen.SelectedShuttle.Name); - msg.Write(GameMain.NetLobbyScreen.SelectedShuttle.MD5Hash.Hash); - - msg.Write(selectedMode.Name); - - msg.Write(AllowRespawn); - - //msg.Write(GameMain.NetLobbyScreen.GameDuration.TotalMinutes); - - var characters = Character.CharacterList.FindAll(c => !(c is AICharacter) || c.SpawnedMidRound); - - msg.Write((byte)characters.Count); - foreach (Character c in characters) - { - WriteCharacterData(msg, c.Name, c); - } - - return msg; - } - public void EndGame() { if (!gameStarted) return; @@ -1029,114 +480,14 @@ namespace Barotrauma.Networking if (connectedClients.Count > 0) { - NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.EndGame); - msg.Write(endMessage); - - if (server.ConnectionsCount > 0) - { - server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableOrdered, 0); - } - foreach (Client client in connectedClients) { client.Character = null; client.inGame = false; } } - - CoroutineManager.StartCoroutine(EndCinematic()); } - - public IEnumerable EndCinematic() - { - float endPreviewLength = 10.0f; - - var cinematic = new TransitionCinematic(Submarine.MainSub, GameMain.GameScreen.Cam, endPreviewLength); - - float secondsLeft = endPreviewLength; - - do - { - secondsLeft -= CoroutineManager.UnscaledDeltaTime; - - yield return CoroutineStatus.Running; - } while (secondsLeft > 0.0f); - - Submarine.Unload(); - - GameMain.NetLobbyScreen.Select(); - - yield return CoroutineStatus.Success; - } - - public void SendRespawnManagerMsg(List spawnedCharacters = null, List spawnedItems = null, List recipients = null) - { - if (respawnManager == null) return; - - NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.Respawn); - - respawnManager.WriteNetworkEvent(msg, spawnedCharacters, spawnedItems); - - SendMessage(msg, NetDeliveryMethod.ReliableUnordered, recipients); - } - - private void DisconnectClient(NetConnection senderConnection, string msg = "", string targetmsg = "") - { - Client client = connectedClients.Find(x => x.Connection == senderConnection); - if (client == null) return; - - DisconnectClient(client, msg, targetmsg); - } - - private void DisconnectClient(Client client, string msg = "", string targetmsg = "") - { - if (client == null) return; - - if (gameStarted && client.Character != null) - { - client.Character.ClearInputs(); - client.Character.Kill(CauseOfDeath.Disconnected, true); - } - - client.Character = null; - client.inGame = false; - - if (string.IsNullOrWhiteSpace(msg)) msg = client.name + " has left the server"; - if (string.IsNullOrWhiteSpace(targetmsg)) targetmsg = "You have left the server"; - - Log(msg, ChatMessage.MessageColor[(int)ChatMessageType.Server]); - - client.Connection.Disconnect(targetmsg); - - //notify other players about the disconnected client - NetOutgoingMessage outmsg = server.CreateMessage(); - outmsg.Write((byte)PacketTypes.PlayerLeft); - outmsg.Write(client.ID); - outmsg.Write(msg); - - GameMain.NetLobbyScreen.RemovePlayer(client.name); - - if (server.Connections.Count > 0) - { - server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0); - } - - connectedClients.Remove(client); - if (client.FileStreamSender != null) - { - client.FileStreamSender.Dispose(); - client.FileStreamSender = null; - } - - AddChatMessage(msg, ChatMessageType.Server); - - UpdateCrewFrame(); - - refreshMasterTimer = DateTime.Now; - } - + private void UpdateCrewFrame() { List crew = new List(); @@ -1152,92 +503,7 @@ namespace Barotrauma.Networking //if (GameMain.GameSession!=null) GameMain.GameSession.CrewManager.CreateCrewFrame(crew); } - - public override void KickPlayer(string playerName, bool ban) - { - playerName = playerName.ToLowerInvariant(); - - Client client = connectedClients.Find(c => - c.name.ToLowerInvariant() == playerName || - (c.Character != null && c.Character.Name.ToLowerInvariant() == playerName)); - - KickClient(client, ban); - } - - public void KickClient(Client client, bool ban = false) - { - if (client == null) return; - - if (ban) - { - DisconnectClient(client, client.name + " has been banned from the server", "You have been banned from the server"); - banList.BanPlayer(client.name, client.Connection.RemoteEndPoint.Address.ToString()); - } - else - { - DisconnectClient(client, client.name + " has been kicked from the server", "You have been kicked from the server"); - } - } - - private void UpdateFileTransfer(Client client, float deltaTime) - { - if (client.FileStreamSender == null) return; - - var clientNameBox = GameMain.NetLobbyScreen.PlayerList.FindChild(client.name); - var clientInfo = clientNameBox.FindChild(client.FileStreamSender); - - if (clientInfo == null) - { - clientNameBox.ClearChildren(); - - clientInfo = new GUIFrame(new Rectangle(0, 0, 180, 0), Color.Transparent, Alignment.TopRight, null, clientNameBox); - clientInfo.UserData = client.FileStreamSender; - new GUIProgressBar(new Rectangle(0, 4, 160, clientInfo.Rect.Height - 8), Color.Green, GUI.Style, 0.0f, Alignment.Left, clientInfo).IsHorizontal = true; - new GUITextBlock(new Rectangle(0, 2, 160, 0), "", GUI.Style, Alignment.TopLeft, Alignment.Left | Alignment.CenterY, clientInfo, true, GUI.SmallFont); - - var cancelButton = new GUIButton(new Rectangle(20, 0, 14, 0), "X", Alignment.Right, GUI.Style, clientInfo); - cancelButton.OnClicked = (GUIButton button, object userdata) => - { - (cancelButton.Parent.UserData as FileStreamSender).CancelTransfer(); - return true; - }; - } - else - { - var progressBar = clientInfo.GetChild(); - progressBar.BarSize = client.FileStreamSender.Progress; - - var progressText = clientInfo.GetChild(); - progressText.Text = client.FileStreamSender.FileName + " " + - MathUtils.GetBytesReadable(client.FileStreamSender.Sent) + " / " + MathUtils.GetBytesReadable(client.FileStreamSender.FileSize); - } - - client.FileStreamSender.Update(deltaTime); - - if (client.FileStreamSender.Status != FileTransferStatus.Sending && - client.FileStreamSender.Status != FileTransferStatus.NotStarted) - { - if (client.FileStreamSender.Status == FileTransferStatus.Canceled) - { - SendCancelTransferMessage(client, "File transfer was canceled by the server."); - } - - clientNameBox.RemoveChild(clientInfo); - - client.FileStreamSender.Dispose(); - client.FileStreamSender = null; - } - } - - private void SendCancelTransferMessage(Client client, string message) - { - var outmsg = server.CreateMessage(); - outmsg.Write((byte)PacketTypes.RequestFile); - outmsg.Write(false); - outmsg.Write(message); - server.SendMessage(outmsg, client.Connection, NetDeliveryMethod.ReliableUnordered); - } - + public void NewTraitor(Character traitor, Character target) { Log(traitor.Name + " is the traitor and the target is " + target.Name, Color.Cyan); @@ -1249,14 +515,7 @@ namespace Barotrauma.Networking traitorClient = c; break; } - - NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.Traitor); - msg.Write(target.Info.Name); - if (server.Connections.Count > 0) - { - server.SendMessage(msg, traitorClient.Connection, NetDeliveryMethod.ReliableUnordered, 0); - } + } public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch) diff --git a/Subsurface/Source/Networking/GameServerLogin.cs b/Subsurface/Source/Networking/GameServerLogin.cs index 8ede07b02..4457cee2e 100644 --- a/Subsurface/Source/Networking/GameServerLogin.cs +++ b/Subsurface/Source/Networking/GameServerLogin.cs @@ -27,250 +27,6 @@ namespace Barotrauma.Networking partial class GameServer : NetworkMember, IPropertyObject { List unauthenticatedClients = new List(); - - private void HandleConnectionApproval(NetIncomingMessage inc) - { - if ((PacketTypes)inc.ReadByte() != PacketTypes.Login) return; - - if (banList.IsBanned(inc.SenderEndPoint.Address.ToString())) - { - inc.SenderConnection.Deny("You have been banned from the server"); - DebugConsole.NewMessage("Banned player tried to join the server", Color.Red); - return; - } - - if (connectedClients.Any(c => c.Connection == inc.SenderConnection)) - { - inc.SenderConnection.Deny("Connection error - already joined"); - return; - } - - int nonce = CryptoRandom.Instance.Next(); - var msg = server.CreateMessage(); - msg.Write(nonce); - - unauthenticatedClients.Add(new UnauthenticatedClient(inc.SenderConnection, nonce)); - - inc.SenderConnection.Approve(msg); - } - - private void CheckAuthentication(NetIncomingMessage inc) - { - var unauthenticatedClient = unauthenticatedClients.Find(uc => uc.Connection == inc.SenderConnection); - if (unauthenticatedClient != null) - { - unauthenticatedClients.Remove(unauthenticatedClient); - - string saltedPw = password; - saltedPw = saltedPw + Convert.ToString(unauthenticatedClient.Nonce); - saltedPw = Encoding.UTF8.GetString(NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(saltedPw))); - NetEncryption algo = new NetXtea(server, saltedPw); - inc.Decrypt(algo); - - string rdPw = inc.ReadString(); - if (rdPw != saltedPw) - { - inc.SenderConnection.Disconnect("Wrong password!"); - return; - } - } - else - { - inc.SenderConnection.Disconnect("Authentication failed"); - return; - } - - if (ConnectedClients.Count>=config.MaximumConnections) - { - inc.SenderConnection.Disconnect("Server full"); - return; - } - - DebugConsole.NewMessage("New player has joined the server", Color.White); - - byte userID; - string version = "", packageName = "", packageHash = "", name = ""; - try - { - userID = inc.ReadByte(); - version = inc.ReadString(); - packageName = inc.ReadString(); - packageHash = inc.ReadString(); - name = Client.SanitizeName(inc.ReadString()); - } - catch - { - inc.SenderConnection.Disconnect("Connection error - server failed to read your ConnectionApproval message"); - DebugConsole.NewMessage("Connection error - server failed to read the ConnectionApproval message", Color.Red); - return; - } - -#if !DEBUG - if (string.IsNullOrWhiteSpace(name)) - { - inc.SenderConnection.Disconnect("Invalid username"); - DebugConsole.NewMessage(name + " couldn't join the server (name empty)", Color.Red); - return; - } - else if (!Client.IsValidName(name)) - { - inc.SenderConnection.Disconnect("Username contains illegal symbols"); - DebugConsole.NewMessage(name + " couldn't join the server (username contains illegal symbols)", Color.Red); - return; - - } - else if (version != GameMain.Version.ToString()) - { - inc.SenderConnection.Disconnect("Version " + GameMain.Version + " required to connect to the server (Your version: " + version + ")"); - DebugConsole.NewMessage(name + " couldn't join the server (wrong game version)", Color.Red); - return; - } - else if (packageName != GameMain.SelectedPackage.Name) - { - inc.SenderConnection.Disconnect("Your content package (" + packageName + ") doesn't match the server's version (" + GameMain.SelectedPackage.Name + ")"); - DebugConsole.NewMessage(name + " couldn't join the server (wrong content package name)", Color.Red); - return; - } - else if (packageHash != GameMain.SelectedPackage.MD5hash.Hash) - { - inc.SenderConnection.Disconnect("Your content package (MD5: " + packageHash + ") doesn't match the server's version (MD5: " + GameMain.SelectedPackage.MD5hash.Hash + ")"); - DebugConsole.NewMessage(name + " couldn't join the server (wrong content package hash)", Color.Red); - return; - } - else if (connectedClients.Any(c => c.name.ToLower() == name.ToLower() && c.Connection != inc.SenderConnection)) - { - inc.SenderConnection.Disconnect("The name ''" + name + "'' is already in use. Please choose another name."); - DebugConsole.NewMessage(name + " couldn't join the server (name already in use)", Color.Red); - return; - } - -#endif - - //existing user re-joining - if (userID > 0) - { - Client existingClient = connectedClients.Find(c => - c.ID == userID && - c.Connection == inc.SenderConnection); - - if (existingClient == null) - { - existingClient = disconnectedClients.Find(c => - c.ID == userID && - c.Connection == inc.SenderConnection); - - if (existingClient != null) - { - disconnectedClients.Remove(existingClient); - connectedClients.Add(existingClient); - - UpdateCrewFrame(); - } - } - if (existingClient != null) - { - existingClient.Connection = inc.SenderConnection; - LogClientIn(inc); - return; - } - } - - userID = 1; - while (connectedClients.Any(c => c.ID == userID)) - { - userID++; - } - - Client newClient = new Client(server, name, userID); - newClient.Connection = inc.SenderConnection; - newClient.version = version; - - var savedPermissions = clientPermissions.Find(cp => cp.IP == newClient.Connection.RemoteEndPoint.Address.ToString()); - if (savedPermissions != null) - { - newClient.SetPermissions(savedPermissions.Permissions); - } - - connectedClients.Add(newClient); - - UpdateCrewFrame(); - - LogClientIn(inc); - - refreshMasterTimer = DateTime.Now; - } - - private void LogClientIn(NetIncomingMessage inc) - { - Client sender = connectedClients.Find(x => x.Connection == inc.SenderConnection); - - if (sender == null) return; - - if (sender.version != GameMain.Version.ToString()) - { - DisconnectClient(sender, sender.name + " was unable to connect to the server (nonmatching game version)", - "Version " + GameMain.Version + " required to connect to the server (Your version: " + sender.version + ")"); - } - else if (connectedClients.Find(x => x.name == sender.name && x != sender) != null) - { - DisconnectClient(sender, sender.name + " was unable to connect to the server (name already in use)", - "The name ''" + sender.name + "'' is already in use. Please choose another name."); - } - else - { - //AssignJobs(); - - GameMain.NetLobbyScreen.RemovePlayer(sender.name); - GameMain.NetLobbyScreen.AddPlayer(sender.name); - - // Notify the client that they have logged in - var outmsg = server.CreateMessage(); - - outmsg.Write((byte)PacketTypes.LoggedIn); - outmsg.Write(sender.ID); - outmsg.Write((int)sender.Permissions); - outmsg.Write(gameStarted); - outmsg.Write(gameStarted && sender.Character != null && !sender.Character.IsDead); - outmsg.Write(AllowSpectating); - - //notify the client about other clients already logged in - outmsg.Write((byte)((characterInfo == null) ? connectedClients.Count - 1 : connectedClients.Count)); - foreach (Client c in connectedClients) - { - if (c.Connection == inc.SenderConnection) continue; - outmsg.Write(c.name); - outmsg.Write(c.ID); - } - - if (characterInfo != null) - { - outmsg.Write(characterInfo.Name); - outmsg.Write((byte)0); - } - - var subs = GameMain.NetLobbyScreen.GetSubList(); - outmsg.Write((byte)subs.Count); - foreach (Submarine sub in subs) - { - outmsg.Write(sub.Name); - outmsg.Write(sub.MD5Hash.Hash); - } - - server.SendMessage(outmsg, inc.SenderConnection, NetDeliveryMethod.ReliableUnordered, 0); - - //notify other clients about the new client - outmsg = server.CreateMessage(); - outmsg.Write((byte)PacketTypes.PlayerJoined); - outmsg.Write(sender.name); - outmsg.Write(sender.ID); - - //send the message to everyone except the client who just logged in - SendMessage(outmsg, NetDeliveryMethod.ReliableUnordered, inc.SenderConnection); - - AddChatMessage(sender.name + " has joined the server", ChatMessageType.Server); - } - } - - + } } diff --git a/Subsurface/Source/Networking/GameServerSettings.cs b/Subsurface/Source/Networking/GameServerSettings.cs index fe6161671..e0fcf3d7e 100644 --- a/Subsurface/Source/Networking/GameServerSettings.cs +++ b/Subsurface/Source/Networking/GameServerSettings.cs @@ -214,8 +214,6 @@ namespace Barotrauma.Networking doc.Root.SetAttributeValue("SubSelection", subSelectionMode.ToString()); doc.Root.SetAttributeValue("ModeSelection", modeSelectionMode.ToString()); - - doc.Root.SetAttributeValue("MaxFileTransferDuration", FileStreamSender.MaxTransferDuration.TotalSeconds); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; @@ -250,8 +248,6 @@ namespace Barotrauma.Networking Enum.TryParse(ToolBox.GetAttributeString(doc.Root, "ModeSelection", "Manual"), out modeSelectionMode); Voting.AllowModeVoting = modeSelectionMode == SelectionMode.Vote; - FileStreamSender.MaxTransferDuration = new TimeSpan(0,0,ToolBox.GetAttributeInt(doc.Root, "MaxFileTransferDuration", 150)); - showLogButton.Visible = SaveServerLogs; } diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index d18587249..48103d3b8 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -9,45 +9,6 @@ using Barotrauma.Items.Components; namespace Barotrauma.Networking { - enum PacketTypes : byte - { - Unknown, - - Login, LoggedIn, - - PlayerJoined, PlayerLeft, - - KickPlayer, - - Permissions, - - RequestNetLobbyUpdate, - - StartGame, EndGame, CanStartGame, - - NewItem, RemoveItem, - - NewCharacter, - - CharacterInfo, - - Chatmessage, UpdateNetLobby, - - NetworkEvent, - - Traitor, - - Vote, VoteStatus, - - ResendRequest, ReliableMessage, LatestMessageID, - - RequestFile, FileStream, - - SpectateRequest, - - Respawn - } - enum VoteType { Unknown, @@ -152,65 +113,6 @@ namespace Barotrauma.Networking Voting = new Voting(); } - protected NetOutgoingMessage ComposeNetworkEventMessage(NetworkEventDeliveryMethod deliveryMethod, NetConnection excludedConnection = null) - { - if (netPeer == null) return null; - - var events = NetworkEvent.Events.FindAll(e => e.DeliveryMethod == deliveryMethod); - if (events.Count == 0) return null; - - List msgBytes = new List(); - - foreach (NetworkEvent networkEvent in events) - { - if (excludedConnection != null && networkEvent.SenderConnection == excludedConnection) continue; - - NetBuffer tempMessage = new NetBuffer();// server.CreateMessage(); - if (!networkEvent.FillData(tempMessage)) continue; - tempMessage.WritePadBits(); - - tempMessage.Position = 0; - msgBytes.Add(tempMessage.ReadBytes(tempMessage.LengthBytes)); - -#if DEBUG - string msgType = networkEvent.Type.ToString(); - if (networkEvent.Type == NetworkEventType.EntityUpdate) - { - msgType += " (" + Entity.FindEntityByID(networkEvent.ID) + ")"; - } - - long sentBytes = 0; - if (!messageCount.TryGetValue(msgType, out sentBytes)) - { - messageCount.Add(msgType, tempMessage.LengthBytes); - } - else - { - messageCount[msgType] += tempMessage.LengthBytes; - } -#endif - } - - if (msgBytes.Count == 0) return null; - - NetOutgoingMessage message = netPeer.CreateMessage(); - message.Write((byte)PacketTypes.NetworkEvent); - - message.Write((float)NetTime.Now); - - message.Write((byte)msgBytes.Count); - foreach (byte[] msgData in msgBytes) - { - if (msgData.Length > 255) DebugConsole.ThrowError("Too large networkevent (" + msgData.Length + " bytes)"); - - message.Write((byte)msgData.Length); - message.Write(msgData); - } - - - return message; - } - public bool TypingChatMessage(GUITextBox textBox, string text) { string tempStr; diff --git a/Subsurface/Source/Networking/RespawnManager.cs b/Subsurface/Source/Networking/RespawnManager.cs index 3940e64a3..4d34b9afd 100644 --- a/Subsurface/Source/Networking/RespawnManager.cs +++ b/Subsurface/Source/Networking/RespawnManager.cs @@ -161,7 +161,6 @@ namespace Barotrauma.Networking if (!CountdownStarted) { CountdownStarted = true; - server.SendRespawnManagerMsg(); } } else @@ -209,7 +208,6 @@ namespace Barotrauma.Networking state = State.Returning; CountdownStarted = false; - server.SendRespawnManagerMsg(); shuttleReturnTimer = maxTransportTime; shuttleTransportTimer = maxTransportTime; } @@ -275,8 +273,6 @@ namespace Barotrauma.Networking state = State.Waiting; respawnTimer = respawnInterval; CountdownStarted = false; - - server.SendRespawnManagerMsg(); } } } @@ -459,103 +455,8 @@ namespace Barotrauma.Networking character.GiveJobItems(mainSubSpawnPoints[i]); GameMain.GameSession.CrewManager.characters.Add(character); } - - server.SendRespawnManagerMsg(spawnedCharacters, spawnedItems); - } - - public void WriteNetworkEvent(NetOutgoingMessage msg, List spawnedCharacters, List spawnedItems) - { - var server = networkMember as GameServer; - - msg.WriteRangedInteger(0, Enum.GetNames(typeof(State)).Length, (int)state); - - switch (state) - { - case State.Transporting: - msg.Write(maxTransportTime); - - if (spawnedCharacters == null) - { - msg.Write((byte)0); - } - else - { - msg.Write((byte)spawnedCharacters.Count); - foreach (Character character in spawnedCharacters) - { - if (character == server.Character) - { - msg.Write((byte)0); - } - else - { - var ownerClient = server.ConnectedClients.Find(cl => cl.Character == character); - msg.Write((byte)ownerClient.ID); - } - - server.WriteCharacterData(msg, character.Name, character); - } - } - - if (spawnedItems != null) GameMain.Server.SendItemSpawnMessage(spawnedItems); - break; - case State.Waiting: - msg.Write(CountdownStarted); - msg.Write(respawnTimer); - break; - case State.Returning: - //CoroutineManager.StopCoroutines("forcepos"); - //CoroutineManager.StartCoroutine( - // ForceShuttleToPos(new Vector2(Level.Loaded.StartPosition.X, Level.Loaded.Size.Y + 1000.0f), 100.0f), "forcepos"); - break; - } - } - - public void ReadNetworkEvent(NetIncomingMessage inc) - { - var newState = (State)inc.ReadRangedInteger(0, Enum.GetNames(typeof(State)).Length); - - switch (newState) - { - case State.Transporting: - maxTransportTime = inc.ReadSingle(); - - CountdownStarted = false; - - var client = networkMember as GameClient; - int clientCount = inc.ReadByte(); - - //respawning characters -> reset shuttle - if (clientCount > 0) ResetShuttle(); - - for (int i = 0; i < clientCount; i++) - { - byte clientId = inc.ReadByte(); - - var character = client.ReadCharacterData(inc); - } - - if (state != newState) - { - CoroutineManager.StopCoroutines("forcepos"); - CoroutineManager.StartCoroutine(ForceShuttleToPos(Level.Loaded.StartPosition - Vector2.UnitY * Level.ShaftHeight, 100.0f), "forcepos"); - } - - break; - case State.Waiting: - CountdownStarted = inc.ReadBoolean(); - - ResetShuttle(); - - respawnTimer = inc.ReadSingle(); - break; - case State.Returning: - - CountdownStarted = false; - break; - } - - state = newState; + } + } } diff --git a/Subsurface/Source/Networking/FileStreamReceiver.cs b/Subsurface/Source/Networking/disabled/FileStreamReceiver.cs similarity index 100% rename from Subsurface/Source/Networking/FileStreamReceiver.cs rename to Subsurface/Source/Networking/disabled/FileStreamReceiver.cs diff --git a/Subsurface/Source/Networking/FileStreamSender.cs b/Subsurface/Source/Networking/disabled/FileStreamSender.cs similarity index 100% rename from Subsurface/Source/Networking/FileStreamSender.cs rename to Subsurface/Source/Networking/disabled/FileStreamSender.cs diff --git a/Subsurface/Source/CoroutineManager.cs b/Subsurface/Source/disabled/CoroutineManager.cs similarity index 100% rename from Subsurface/Source/CoroutineManager.cs rename to Subsurface/Source/disabled/CoroutineManager.cs