diff --git a/Subsurface/Source/Camera.cs b/Subsurface/Source/Camera.cs index a037506bf..d483da785 100644 --- a/Subsurface/Source/Camera.cs +++ b/Subsurface/Source/Camera.cs @@ -163,12 +163,18 @@ namespace Barotrauma Vector2 moveCam = Vector2.Zero; if (targetPos == Vector2.Zero) { - if (PlayerInput.KeyDown(Keys.A)) moveCam.X -= moveSpeed; - if (PlayerInput.KeyDown(Keys.D)) moveCam.X += moveSpeed; - if (PlayerInput.KeyDown(Keys.S)) moveCam.Y -= moveSpeed; - if (PlayerInput.KeyDown(Keys.W)) moveCam.Y += moveSpeed; + if (GUITextBox.KeyboardDispatcher.Subscriber == null) + { + if (PlayerInput.KeyDown(Keys.LeftShift)) moveSpeed *= 2.0f; + if (PlayerInput.KeyDown(Keys.LeftControl)) moveSpeed *= 0.5f; - moveCam = moveCam * deltaTime * 60.0f; + if (PlayerInput.KeyDown(Keys.A)) moveCam.X -= moveSpeed; + if (PlayerInput.KeyDown(Keys.D)) moveCam.X += moveSpeed; + if (PlayerInput.KeyDown(Keys.S)) moveCam.Y -= moveSpeed; + if (PlayerInput.KeyDown(Keys.W)) moveCam.Y += moveSpeed; + + moveCam = moveCam * deltaTime * 60.0f; + } Zoom = MathHelper.Clamp(zoom + (PlayerInput.ScrollWheelSpeed / 1000.0f) * zoom, 0.1f, 2.0f); diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 61ba42294..7d11a8001 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1037,7 +1037,7 @@ namespace Barotrauma public void StartStun(float stunTimer) { - if (stunTimer <= 0.0f) return; + if (stunTimer <= 0.0f || !MathUtils.IsValid(stunTimer)) return; AnimController.ResetPullJoints(); AnimController.StunTimer = Math.Max(AnimController.StunTimer, stunTimer); @@ -1247,25 +1247,31 @@ namespace Barotrauma // i++; //} - message.WriteRangedSingle(MathHelper.Clamp(AnimController.StunTimer,0.0f,60.0f), 0.0f, 60.0f, 8); - message.Write((byte)((health/maxHealth)*255.0f)); - message.Write((byte)(MathHelper.Clamp(oxygen * 2.55f, 0.0f, 255.0f))); + message.Write((byte)((health / maxHealth) * 255.0f)); + + if (AnimController.StunTimer<=0.0f && bleeding<=0.0f && oxygen>99.0f) + { + message.Write(true); + } + else + { + message.Write(false); + + message.WriteRangedSingle(MathHelper.Clamp(AnimController.StunTimer, 0.0f, 60.0f), 0.0f, 60.0f, 8); + + message.Write((byte)(MathHelper.Clamp(oxygen * 2.55f, 0.0f, 255.0f))); + + bleeding = MathHelper.Clamp(bleeding, 0.0f, 5.0f); + message.WriteRangedSingle(bleeding, 0.0f, 5.0f, 8); + + } + return true; case NetworkEventType.EntityUpdate: - var hasInputs = - IsKeyDown(InputType.Left) || - IsKeyDown(InputType.Right) || - IsKeyDown(InputType.Up) || - IsKeyDown(InputType.Down) || - IsKeyDown(InputType.Use) || - IsKeyDown(InputType.Aim); - message.Write(hasInputs); message.Write((float)NetTime.Now); - if (!hasInputs) return true; - message.Write(keys[(int)InputType.Use].DequeueHeld); bool secondaryHeld = keys[(int)InputType.Aim].DequeueHeld; @@ -1278,7 +1284,7 @@ namespace Barotrauma message.Write(keys[(int)InputType.Down].Held); message.Write(keys[(int)InputType.Run].Held); - + if (secondaryHeld) { Vector2 relativeCursorPosition = cursorPosition - Position; @@ -1382,46 +1388,17 @@ namespace Barotrauma inventory.ReadNetworkData(NetworkEventType.InventoryUpdate, message); return; case NetworkEventType.ImportantEntityUpdate: - //foreach (Limb limb in AnimController.Limbs) - //{ - // Vector2 limbPos = limb.SimPosition, vel = Vector2.Zero; - // float rotation = limb.Rotation; + + Health = (message.ReadByte() / 255.0f) * maxHealth; - // try - // { - // limbPos.X = message.ReadRangedSingle(-NetConfig.CharacterIgnoreDistance, NetConfig.CharacterIgnoreDistance, 16); - // limbPos.Y = message.ReadRangedSingle(-NetConfig.CharacterIgnoreDistance, NetConfig.CharacterIgnoreDistance, 16); - - // rotation = message.ReadFloat(); - // } - // catch - // { - // return; - // } - - // if (limb.body != null) - // { - // limb.body.TargetVelocity = limb.body.LinearVelocity; - // limb.body.TargetPosition = limbPos;// +vel * (float)(deltaTime / 60.0); - // limb.body.TargetRotation = rotation;// +angularVel * (float)(deltaTime / 60.0); - // limb.body.TargetAngularVelocity = limb.body.AngularVelocity; - // } - - //} - - float newStunTimer = 0.0f, newHealth = 0.0f, newOxygen = 0.0f; - - try - { - newStunTimer = message.ReadRangedSingle(0.0f, 60.0f, 8); - newHealth = (message.ReadByte() / 255.0f) * maxHealth; - newOxygen = (message.ReadByte() / 2.55f); - } - catch { return; } + bool allOk = message.ReadBoolean(); + if (allOk) return; + float newStunTimer = message.ReadRangedSingle(0.0f, 60.0f, 8); StartStun(newStunTimer); - Health = newHealth; - oxygen = newOxygen; + + Oxygen = (message.ReadByte() / 2.55f); + Bleeding = message.ReadRangedSingle(0.0f, 5.0f, 8); return; case NetworkEventType.EntityUpdate: @@ -1434,14 +1411,9 @@ namespace Barotrauma try { - bool hasInputs = message.ReadBoolean(); - sendingTime = message.ReadFloat(); - - if (!hasInputs) - { - if (sendingTime > LastNetworkUpdate) ClearInputs(); - return; - } + sendingTime = message.ReadFloat(); + + if (sendingTime > LastNetworkUpdate) ClearInputs(); actionKeyState = message.ReadBoolean(); secondaryKeyState = message.ReadBoolean(); @@ -1456,13 +1428,19 @@ namespace Barotrauma catch (Exception e) { +#if DEBUG + DebugConsole.ThrowError("Error in Character.ReadNetworkData: " + e.Message); +#endif return; } AnimController.IsStanding = true; - keys[(int)InputType.Use].Held = actionKeyState; - keys[(int)InputType.Aim].Held = secondaryKeyState; + keys[(int)InputType.Use].Held = actionKeyState; + keys[(int)InputType.Use].SetState(false, actionKeyState); + + keys[(int)InputType.Aim].Held = secondaryKeyState; + keys[(int)InputType.Aim].SetState(false, secondaryKeyState); if (sendingTime <= LastNetworkUpdate) return; diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index 0cc60d9fc..448528576 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -5,6 +5,7 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Barotrauma.Networking; +using Barotrauma.Items.Components; namespace Barotrauma { @@ -259,6 +260,15 @@ namespace Barotrauma } } break; + case "power": + Item reactorItem = Item.ItemList.Find(i => i.GetComponent() != null); + if (reactorItem == null) return; + + var reactor = reactorItem.GetComponent(); + reactor.ShutDownTemp = 7000.0f; + reactor.AutoTemp = true; + reactor.Temperature = 5000.0f; + break; case "shake": GameMain.GameScreen.Cam.Shake = 10.0f; break; diff --git a/Subsurface/Source/GUI/GUIComponent.cs b/Subsurface/Source/GUI/GUIComponent.cs index 1bf6fe961..5015214af 100644 --- a/Subsurface/Source/GUI/GUIComponent.cs +++ b/Subsurface/Source/GUI/GUIComponent.cs @@ -375,7 +375,7 @@ namespace Barotrauma public List FindChildren(object userData) { - return children .FindAll(c => c.userData == userData); + return children.FindAll(c => c.userData == userData); } public virtual void ClearChildren() diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index 844f127da..cc32ed0a0 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -381,7 +381,7 @@ namespace Barotrauma Item item = Entity.FindEntityByID(itemId) as Item; if (item == null) continue; - if (items[i] != item) items[i].Drop(character, false); + if (items[i] != item && items[i] != null) items[i].Drop(character, false); TryPutItem(item, i, false); } } diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index ec0ffc18b..3a8284b0a 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -118,7 +118,7 @@ namespace Barotrauma if (item.inventory != null && removeItem) { - item.Drop(); + item.Drop(null, false); item.inventory.RemoveItem(item); } diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index 8f0d6cc9a..606ea60ae 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -390,8 +390,7 @@ namespace Barotrauma if (sectionIndex < 0 || sectionIndex > sections.Length - 1) return; - if (GameMain.Client == null) - SetDamage(sectionIndex, sections[sectionIndex].damage + damage); + if (GameMain.Client == null) SetDamage(sectionIndex, sections[sectionIndex].damage + damage); } @@ -453,7 +452,7 @@ namespace Barotrauma if (damage != sections[sectionIndex].damage && Math.Abs(sections[sectionIndex].lastSentDamage - damage)>5.0f) { - new NetworkEvent(NetworkEventType.WallDamage, ID, false); + new NetworkEvent(NetworkEventType.ImportantEntityUpdate, ID, false); //sections[sectionIndex].lastSentDamage = damage; } @@ -642,17 +641,19 @@ namespace Barotrauma { message.Write((float)NetTime.Now); - var updateSections = Array.FindAll(sections, s => s != null && Math.Abs(s.damage - s.lastSentDamage)/Health > 0.01f); + //var updateSections = Array.FindAll(sections, s => s != null && Math.Abs(s.damage - s.lastSentDamage) > 0.01f); - if (updateSections.Length == 0) return false; + //if (updateSections.Length == 0) return false; - Debug.Assert(updateSections.Length<255); + //Debug.Assert(updateSections.Length<255); - message.Write((byte)updateSections.Length); + // message.Write((byte)updateSections.Length); - for (int i = 0; i < updateSections.Length; i++) + for (int i = 0; i < sections.Length; i++) { - message.Write((byte)i); + //if (Math.Abs(sections[i].damage - sections[i].lastSentDamage) < 0.01f) continue; + + //message.Write((byte)i); message.WriteRangedSingle(sections[i].damage / Health, 0.0f, 1.0f, 8); sections[i].lastSentDamage = sections[i].damage; @@ -668,17 +669,19 @@ namespace Barotrauma float updateTime = message.ReadFloat(); if (updateTime < lastUpdate) return; - int sectionCount = message.ReadByte(); + // int sectionCount = message.ReadByte(); - for (int i = 0; i= sections.Length) continue; + //if (sectionIndex < 0 || sectionIndex >= sections.Length) continue; - SetDamage(sectionIndex, damage); + SetDamage(i, damage); } + + lastUpdate = updateTime; } } diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 2343dab0c..ddfbaafd8 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -248,7 +248,7 @@ namespace Barotrauma.Networking if (gameStarted && disconnectedClients[i].Character!=null) { - disconnectedClients[i].Character.Remove(); + disconnectedClients[i].Character.Kill(CauseOfDeath.Damage, true); disconnectedClients[i].Character = null; } @@ -609,7 +609,7 @@ namespace Barotrauma.Networking { if (NetworkEvent.Events.Count == 0) return; - List recipients = ConnectedClients.FindAll(c => c.Character != null); + List recipients = ConnectedClients.FindAll(c => c.Character != null || c.Spectating); if (recipients.Count == 0) return; @@ -784,6 +784,7 @@ namespace Barotrauma.Networking var messageBox = new GUIMessageBox("The round has ended", endMessage, 400, 300); Character.Controlled = null; + myCharacter = null; GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; GameMain.LightManager.LosEnabled = false; diff --git a/Subsurface/Source/Networking/NetConfig.cs b/Subsurface/Source/Networking/NetConfig.cs index ea298bca7..7ca0c7c49 100644 --- a/Subsurface/Source/Networking/NetConfig.cs +++ b/Subsurface/Source/Networking/NetConfig.cs @@ -32,6 +32,7 @@ namespace Barotrauma.Networking public const float IdSendInterval = 0.2f; public const float RerequestInterval = 0.2f; - public const int ResendAttempts = 8; + public const int ReliableMessageBufferSize = 100; + public const int ResendAttempts = 10; } } diff --git a/Subsurface/Source/Networking/NetworkEvent.cs b/Subsurface/Source/Networking/NetworkEvent.cs index f14824c73..98a5a9519 100644 --- a/Subsurface/Source/Networking/NetworkEvent.cs +++ b/Subsurface/Source/Networking/NetworkEvent.cs @@ -201,7 +201,7 @@ namespace Barotrauma.Networking } - System.Diagnostics.Debug.WriteLine(e.ToString()); + //System.Diagnostics.Debug.WriteLine(e.ToString()); object data; diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index f194caf36..dc58bc30d 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -229,7 +229,7 @@ namespace Barotrauma.Networking public virtual void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch) { - if (!gameStarted && Screen.Selected != GameMain.GameScreen) return; + if (!gameStarted || Screen.Selected != GameMain.GameScreen) return; inGameHUD.Draw(spriteBatch); } diff --git a/Subsurface/Source/Networking/ReliableSender.cs b/Subsurface/Source/Networking/ReliableSender.cs index 2a9de7300..c535f1a4e 100644 --- a/Subsurface/Source/Networking/ReliableSender.cs +++ b/Subsurface/Source/Networking/ReliableSender.cs @@ -97,14 +97,13 @@ namespace Barotrauma.Networking.ReliableMessages message.Write((byte)PacketTypes.ReliableMessage); message.Write(messageID); - int bufferSize=100; - if (messageBuffer.Count>bufferSize) + if (messageBuffer.Count > NetConfig.ReliableMessageBufferSize) { - - int end = messageCount-bufferSize; - int start = end - (messageBuffer.Count - bufferSize); - if (start<=0) + int end = messageCount - NetConfig.ReliableMessageBufferSize; + int start = end - (messageBuffer.Count - NetConfig.ReliableMessageBufferSize); + + if (start<0) { int wrappedStart = start + ushort.MaxValue; if (wrappedStart==0) wrappedStart = ushort.MaxValue; @@ -119,7 +118,7 @@ namespace Barotrauma.Networking.ReliableMessages } } - for (ushort i = (ushort)Math.Max(start,1); i <= (ushort)Math.Max(end,1); i++) + for (ushort i = (ushort)Math.Max(start,0); i <= (ushort)Math.Max(end,0); i++) { messageBuffer.Remove(i); if (i == ushort.MaxValue) break; @@ -219,12 +218,11 @@ namespace Barotrauma.Networking.ReliableMessages { foreach (var message in missingMessages.Where(m => m.Value.ResendRequestsSent > NetConfig.ResendAttempts).ToList()) { + Debug.WriteLine("Max rerequest attempts reached on message "+message.Value.ID); missingMessages.Remove(message.Key); } - int bufferSize = 20; - - while (missingMessageIds.Count>bufferSize) + while (missingMessageIds.Count>NetConfig.ReliableMessageBufferSize) { ushort id = missingMessageIds.Dequeue(); @@ -245,7 +243,8 @@ namespace Barotrauma.Networking.ReliableMessages resendRequest.Write((byte)PacketTypes.ResendRequest); resendRequest.Write(missingMessage.ID); - receiver.SendMessage(resendRequest, recipient, NetDeliveryMethod.Unreliable); + receiver.SendMessage(resendRequest, recipient, + missingMessage.ResendRequestsSent==0 ? NetDeliveryMethod.ReliableUnordered : NetDeliveryMethod.Unreliable); missingMessage.ResendTimer = Math.Max(recipient.AverageRoundtripTime, NetConfig.RerequestInterval); diff --git a/Subsurface/Source/PlayerInput.cs b/Subsurface/Source/PlayerInput.cs index 1c5214111..2ca454954 100644 --- a/Subsurface/Source/PlayerInput.cs +++ b/Subsurface/Source/PlayerInput.cs @@ -148,6 +148,12 @@ namespace Barotrauma if (held) heldQueue = true; } + public void SetState(bool hit, bool held) + { + if (hit) hitQueue = true; + if (held) heldQueue = true; + } + public bool Dequeue { get diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index a1f409a8e..065732e91 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -296,6 +296,7 @@ namespace Barotrauma infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "startButton")); + infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "settingsButton")); infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "spectateButton")); playerList.Parent.RemoveChild(playerList.Parent.children.Find(c => c.UserData as string == "banListButton")); @@ -313,7 +314,6 @@ namespace Barotrauma GUIButton settingsButton = new GUIButton(new Rectangle(-100, 0, 80, 30), "Settings", Alignment.BottomRight, GUI.Style, infoFrame); settingsButton.OnClicked = GameMain.Server.ToggleSettingsFrame; - settingsButton.CanBeSelected = false; settingsButton.UserData = "settingsButton"; var banListButton = new GUIButton(new Rectangle(0, 30, 100, 20), "Banned IPs", Alignment.BottomRight, GUI.Style, playerList.Parent); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 24d32ac2e..5a7ad99c6 100644 Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ