From cddf4f1bde16910f6a059582767f2bfe3d903687 Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 20 Nov 2015 17:12:33 +0200 Subject: [PATCH] Sending NetTime at the start of a combined networkevent instead of individual networkevents, syncing itemcomponents for spectators, AICharacter importantentityupdates are sent again, misc bugfixes, some new heads --- Subsurface/Barotrauma.csproj | 12 ++ .../Content/Characters/Human/fhead5.png | Bin 0 -> 2371 bytes .../Content/Characters/Human/fhead6.png | Bin 0 -> 2135 bytes Subsurface/Content/Characters/Human/head5.png | Bin 0 -> 2418 bytes Subsurface/Content/Characters/Human/head6.png | Bin 0 -> 2018 bytes Subsurface/Content/Characters/Human/human.xml | 2 +- Subsurface/Source/Characters/AICharacter.cs | 12 +- Subsurface/Source/Characters/Character.cs | 30 +--- Subsurface/Source/Characters/CharacterInfo.cs | 2 +- Subsurface/Source/DebugConsole.cs | 142 ++++++++++++++---- Subsurface/Source/GUI/GUIListBox.cs | 2 +- Subsurface/Source/GUI/GUITextBlock.cs | 4 +- Subsurface/Source/GUI/TitleScreen.cs | 5 +- Subsurface/Source/GameMain.cs | 11 +- Subsurface/Source/Items/CharacterInventory.cs | 5 +- .../Items/Components/Holdable/Holdable.cs | 6 +- .../Source/Items/Components/ItemComponent.cs | 7 +- .../Source/Items/Components/Machines/Pump.cs | 16 +- .../Source/Items/Components/Machines/Radar.cs | 6 +- .../Items/Components/Machines/Reactor.cs | 12 +- .../Items/Components/Machines/Steering.cs | 6 +- .../Items/Components/Power/PowerContainer.cs | 6 +- .../Components/Signal/ConnectionPanel.cs | 6 +- .../Source/Items/Components/Signal/Wire.cs | 6 +- Subsurface/Source/Items/Inventory.cs | 8 +- Subsurface/Source/Items/Item.cs | 13 +- Subsurface/Source/Map/Entity.cs | 2 +- Subsurface/Source/Map/Hull.cs | 2 +- Subsurface/Source/Map/Structure.cs | 9 +- Subsurface/Source/Map/Submarine.cs | 6 +- Subsurface/Source/Map/SubmarineBody.cs | 14 +- Subsurface/Source/Networking/GameClient.cs | 2 +- Subsurface/Source/Networking/GameServer.cs | 29 +++- Subsurface/Source/Networking/NetworkEvent.cs | 8 +- Subsurface/Source/Networking/NetworkMember.cs | 2 + Subsurface/Source/Program.cs | 6 +- Subsurface_Solution.v12.suo | Bin 745472 -> 724992 bytes 37 files changed, 269 insertions(+), 130 deletions(-) create mode 100644 Subsurface/Content/Characters/Human/fhead5.png create mode 100644 Subsurface/Content/Characters/Human/fhead6.png create mode 100644 Subsurface/Content/Characters/Human/head5.png create mode 100644 Subsurface/Content/Characters/Human/head6.png diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 0316478b6..52b7a1885 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -319,6 +319,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -337,6 +343,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/Subsurface/Content/Characters/Human/fhead5.png b/Subsurface/Content/Characters/Human/fhead5.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb1d330d0c409d03f95dea96663d6ff25ca72df GIT binary patch literal 2371 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 N002ovPDHLkV1hA;|K9)r literal 0 HcmV?d00001 diff --git a/Subsurface/Content/Characters/Human/head5.png b/Subsurface/Content/Characters/Human/head5.png new file mode 100644 index 0000000000000000000000000000000000000000..7395e91c1419f59da89849d548f40929f027a2ec GIT binary patch literal 2418 zcmV-&361uNP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ^_(?=TRCwC#m|KipS9!;O>#}d>oH^&r#p4+}u@hg@(1aQqlQ>)iA!-_di2%2t zG)gT{Q(lUA2_QrW50(1B1E>YWLmpZXfus~3QZ=d?E>SKdCUFvEC${6uOdQ)Y_MDkH z*M0V0YkfS79i_@cdx9T$U_EZ_we(xx_g~*li3opaOY;Y~?5G2gs3=C)n#3U|6a{H*j8@RJOGi5>20^{$Tv=n8M#2{Rc5n0E{hxWux5GdA zA?p8fjR=Bz%YP!GLI_@hKdXLUO&xyl0To%R1W`&GgEm^3SgFdG81aRaMM!HkR>ZPe zIuy|N!m`)sH<1Mqy!RBnRYrpP-q-($d%pH10ABjH@2F>wEWNW*tA3(VZ{Dm-bWI3u zRs*5Td$#PKD~G+~i>;;a?%n&5pS6itDcu`q6=4lbF4|0jClomZKboeLT07vs|K*#} z($L;lpPv3~quHE^lNe3F8cmi)XsxR{xUG`6w_Y)v{lLK&UwWe3%kSHK!+V|rP(Z2` zlS(*07@|=q0@^4rb~H=<^H;vkR4p~7j=z>9$yaM>LY5^|YBkbYMjA&XSxRgaRzcZW z#Si%91>65f`cXtw*FGfV zk|aSPxUxXm=9NiWse5z_y=EX0hxZy0K}1G_3f@nM^JGbc5{GvVB15m!Ax=|_wfLe0 zR}v>NS{vdlAu^UwRoNBZWiz zF21!wt}RKkje z+^J4=&?QJfg0O^8Dg_coPssg#*MzcU(5TbBu*7(+!tML+Adg~f7L%{`XzL{^l?r7P zk#{3@XJT3H5;sM*z~xpw(uhO;0YL%vOpN!Ql)ckqxG0C9WTG~Dpy~B z4X+-08Mm^`jkoP*aqcule?YG&$m(^BF(gTXD{_t;JAsNaZvXIYa;WX1#}E9X)C!DN z41=QU*Yp%*L`@;`%h;MbyDQ7|^PHFFPxHR1Nv5Z#Idk+F!3knCf+iFWp&*W8HebDy zO4^{B*2t_;X@21!H%?C7tAQYa)oz!ACyrpXB7_kwr9^&}8FOd5)1g|c^5nroyz5VP z@|Sn+v*oHQdH%P@ z_|c=kU}pUcwdJzAA;#|QVQ*+%sn*G{kd2a#YW8x01leVhwSuAgMAS*JS~(Cc@wDk9U0 zG)?KbA+7cjCT`I0wEyeHXP@2wOuM~cwE+>5YL(`?8H_O)V@9)7q7<>QN3v?RD9+Cm z-s$n_aaJ#^kc?H)af0Ln&b)pOV+@UIm9c7-Y@$IknnrgD+NaMw-nZ2SA6DR^J#N~4 z6I1JF&|0IE9<6lw@z0->G>U&6w0Y7iwW^JkprAQ5fp>u@iJ95BfvM>!JkTpj^5Ag! zfGam{W;j2;!&kcFc0`wV%dX zi;f}|8snJY-zfY>hDy_DXtjPybTlwg)>5W=Yg|b-*ifb>w#p9&32AB1X3aY5Hf_TDlGgbJbds4k z%U*Lu@tpUb;MWqepefX4fEvsnRueaW+}E#uNAAxaSxF=PdKxE3yiSh!qC9@K)!L%0 zt!>!6NqdD_zHpw>2eeI4CVJ3^K%J2w30i5C)@ZHK zT5-0Wzd4=#ejW1C6aQgF$Ngz}PExN_5fL7E^y$kpb$RBY@4wMAUUK8+TlQVLmAvww50-<%D^R{MKEdXzwh9Wg z(%k6bwYlS$e?D~)L;>m&;G03a1IO-tcZJ>i{wD1C^!{-DuHD>y|2MdP*KR&}`^WhI kdPV(llJ`fb%e;O!0GttdYxE((rvLx|07*qoM6N<$f_#9gw*UYD literal 0 HcmV?d00001 diff --git a/Subsurface/Content/Characters/Human/head6.png b/Subsurface/Content/Characters/Human/head6.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8295cd7c568e608bbf3bad9360f5fbd40860a2 GIT binary patch literal 2018 zcmV<82Oao{P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ@Xh}ptRCwC#m|2XTRT;;B=e*mu&OTpf=}bFQ+L>vGR@PFafuTqQBp|{CiyBJ= zql62=i;6U;H-tpEF@(ivlo}H-8e{MRwLqkInQ~{|NjVM3?H?Sd<5eo31u&3@$-*t&&T!3J(EX|UR>-bg_msET2oOt zSq&P0D0Gxg+_HT~<6QO?=TcM8eQSH~U*37|@u*(DBTDcp3pMO~4y3`d1ZxL+$>j2B zoXR(AvlEZHUT*gjzj(_m8`ML$fAapR(`TMMJ6q0S41Q>6&SuDF9TtO-wkDV1{t|Hz zaq#3KrOq}SDPP?>w&kub?tFggyhDBU)-9KO_`%_Q84Js{TwFK9#MwEpEreEddIp>f z>-t;pq~uH`X6339bJITEy(P6~pzGPL?(WBLc;LyC=LPEfk9@^>>F2-PzgP`MY}=wz z4KPL`T^C~%^RUAA1Z!CPiKzNp+UxOxarFmfA+y2EVF9Y?Gt=|$31)6(SP zxK24$YIe!5@5fI(y5i{JAT*|RwVz!P2*hWw-hm_j$ ztZdD)V#SJ}r>Awixuv+vuaW z_Yu zed%>ltxOV~d#0X#W>@p+xoUf0Bs$R;ogx88NTd*i+Mtaf<5;vf7FkjfEiVIS2zml!8{6R3Ih9zG9dpi5dp{GwJl<$ zDCAu>t?r^$i#Rj4K*n=$FkH21kPR0OVYv>8Qb-94Q)S-&;0@A3+q!IXM+OMS?s@Rs z3*AV&8Y|V3w*|(sNR37-&0X6zv*T-@WBSlvdHSW-*mrP}k+t32ee+gU_w|sd1XoMu zre=9}|8ZtdPtvze^yB^1}&`FGuU`a`_P@t!O6;8H^ zs5XbLoVpTeZCn!6$-tZ%THE(i8-tC&5zv}*m|a|8{KG@Ew!7T$nXQlnIG#;4O!31Q zm8NK|Nu!7)Oh`gVD-C3lm}vgQ*pij!!#lryUq@T+wR)UjjG(uph5o@F_Pp~xd-sgv zrV2ZL9NnY`q&gP zHo4KupCgyQZ{xj>`sYpL-E+&0t>dr0a_qWG28y4$Y*-Gg>JgUFXbm_X#(-8DOG+Hq z#`bK|)MoK)Li50SdanEQ)}~VL-t%f4cKzx%ix+RW;MP)WaluF@wzFB?-qmS}EiEM4 zqOJw0u}~=lK|;0Gz%FDNzG9T_{t~V+m1S`=yWTkX`oOBy59d8|NI}h5ZlWwlM+O$d zn7J@vF;bKp35`%wt&|D<8H_&#Iv!d!H)H3!eo|;oW-`)wKsxrOT+waGh02>=tlEp^ zKuBT8XEPKs4h!`;5^Y$$I!|8JhfHlsh+>yna-siwj9z;abBEtNf@i-|@S0kss#XJ8^FvV$l!%gqieG1DzCu*jcwL=^I z!>s3yH|M>{wq|cJpR=QCt*RzwD#m0xPR=LZTL)&NKh4GB<(VK!_x1_2SX`91BtiW`T6=;*@9-1vzCC_CO;bz~vvH^wr8NLo-1+t8$<)8}jX@Z#TuUEq zYRUabb*&v~UA1n~uQyJ0mP(wMoFpS9LJH9ThXF_5)eo`yricHDH+09&1-GevU#_X` zRCjj|BO5jlg%Oq|5z948_;^0`G1SLU=OO+!0M4U~>8&P!g8%>k07*qoM6N<$f(HoR A`Tzg` literal 0 HcmV?d00001 diff --git a/Subsurface/Content/Characters/Human/human.xml b/Subsurface/Content/Characters/Human/human.xml index b94ee1a85..b9639f525 100644 --- a/Subsurface/Content/Characters/Human/human.xml +++ b/Subsurface/Content/Characters/Human/human.xml @@ -1,5 +1,5 @@  - + diff --git a/Subsurface/Source/Characters/AICharacter.cs b/Subsurface/Source/Characters/AICharacter.cs index 7000b67a3..21a1fa076 100644 --- a/Subsurface/Source/Characters/AICharacter.cs +++ b/Subsurface/Source/Characters/AICharacter.cs @@ -112,9 +112,7 @@ namespace Barotrauma return true; case NetworkEventType.EntityUpdate: if (AnimController.RefLimb.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) return false; - - message.Write((float)NetTime.Now); - + message.Write(AnimController.TargetDir == Direction.Right); message.WriteRangedSingle(MathHelper.Clamp(AnimController.TargetMovement.X, -1.0f, 1.0f), -1.0f, 1.0f, 8); message.WriteRangedSingle(MathHelper.Clamp(AnimController.TargetMovement.X, -1.0f, 1.0f), -1.0f, 1.0f, 8); @@ -127,8 +125,8 @@ namespace Barotrauma return true; } - - public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, out object data) + + public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, float sendingTime, out object data) { data = null; Enabled = true; @@ -182,11 +180,9 @@ namespace Barotrauma aiController.ReadNetworkData(message); return; case NetworkEventType.EntityUpdate: - float sendingTime = 0.0f; Vector2 targetMovement = Vector2.Zero; bool targetDir = false; - - sendingTime = message.ReadFloat(); + if (sendingTime <= LastNetworkUpdate) return; Vector2 pos = Vector2.Zero, vel = Vector2.Zero; diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index a4f5c360f..cfacf2c26 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -581,19 +581,7 @@ namespace Barotrauma } } } - - public void CreateUpdateNetworkEvent(bool isClient) - { - //new NetworkEvent(importantUpdateTimer <= 0 ? NetworkEventType.ImportantEntityUpdate : NetworkEventType.EntityUpdate, ID, isClient); - - new NetworkEvent(NetworkEventType.EntityUpdate, ID, isClient); - - - //importantUpdateTimer -= 1; - //if (importantUpdateTimer < 0) importantUpdateTimer = (this is AICharacter) ? 30 : 10; - } - - + public bool HasSelectedItem(Item item) { return selectedItems.Contains(item); @@ -1035,7 +1023,7 @@ namespace Barotrauma health -= attackResult.Damage; if (health <= 0.0f && damageType == DamageType.Burn) Kill(CauseOfDeath.Burn); - bleeding += attackResult.Bleeding; + Bleeding += attackResult.Bleeding; return attackResult; } @@ -1274,9 +1262,6 @@ namespace Barotrauma return true; case NetworkEventType.EntityUpdate: - - message.Write((float)NetTime.Now); - message.Write(keys[(int)InputType.Use].DequeueHeld); bool secondaryHeld = keys[(int)InputType.Aim].DequeueHeld; @@ -1321,7 +1306,7 @@ namespace Barotrauma } } - public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, out object data) + public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, float sendingTime, out object data) { Enabled = true; data = null; @@ -1362,7 +1347,7 @@ namespace Barotrauma if (GameMain.Server != null) { Client sender =GameMain.Server.ConnectedClients.Find(c => c.Connection == message.SenderConnection); - if (sender ==null || sender.Character != this) + if (sender == null || sender.Character != this) throw new Exception("Received a KillCharacter message from someone else than the client controlling the Character!"); } @@ -1390,7 +1375,7 @@ namespace Barotrauma return; case NetworkEventType.InventoryUpdate: if (inventory == null) return; - inventory.ReadNetworkData(NetworkEventType.InventoryUpdate, message); + inventory.ReadNetworkData(NetworkEventType.InventoryUpdate, message, sendingTime); return; case NetworkEventType.ImportantEntityUpdate: @@ -1406,8 +1391,7 @@ namespace Barotrauma Bleeding = message.ReadRangedSingle(0.0f, 5.0f, 8); return; - case NetworkEventType.EntityUpdate: - float sendingTime = 0.0f; + case NetworkEventType.EntityUpdate: Vector2 relativeCursorPos = Vector2.Zero; bool actionKeyState, secondaryKeyState; @@ -1416,8 +1400,6 @@ namespace Barotrauma try { - sendingTime = message.ReadFloat(); - if (sendingTime > LastNetworkUpdate) ClearInputs(); actionKeyState = message.ReadBoolean(); diff --git a/Subsurface/Source/Characters/CharacterInfo.cs b/Subsurface/Source/Characters/CharacterInfo.cs index 297d8c7b5..162931585 100644 --- a/Subsurface/Source/Characters/CharacterInfo.cs +++ b/Subsurface/Source/Characters/CharacterInfo.cs @@ -55,7 +55,7 @@ namespace Barotrauma headSpriteId = value; Vector2 spriteRange = headSpriteRange[gender == Gender.Male ? 0 : 1]; - if (headSpriteId < (int)spriteRange.X) headSpriteId = (int)(spriteRange.Y-1); + if (headSpriteId < (int)spriteRange.X) headSpriteId = (int)(spriteRange.Y); if (headSpriteId > (int)spriteRange.Y) headSpriteId = (int)(spriteRange.X); if (headSpriteId != oldId) headSprite = null; diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index 0702b12a5..dc3c86612 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -27,10 +27,13 @@ namespace Barotrauma static class DebugConsole { - public static List messages = new List(); + public static List Messages = new List(); static bool isOpen; + + static GUIFrame frame; + static GUIListBox listBox; static GUITextBox textBox; //used for keeping track of the message entered when pressing up/down @@ -42,9 +45,20 @@ namespace Barotrauma } public static void Init(GameWindow window) - { - textBox = new GUITextBox(new Rectangle(30, 480,780, 30), Color.Black, Color.White, Alignment.Left, Alignment.Left); - NewMessage("Press F3 to open/close the debug console", Color.Cyan); + { + int x = 20, y = 20; + int width = 800, height = 500; + + frame = new GUIFrame(new Rectangle(x, y, width, height), new Color(0.4f, 0.4f, 0.4f, 0.5f)); + frame.Color = Color.White * 0.4f; + frame.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f); + + listBox = new GUIListBox(new Rectangle(0,0,0, frame.Rect.Height-40), Color.Black*0.8f, null, frame); + + textBox = new GUITextBox(new Rectangle(0,0,0,20), Color.Black*0.6f, Color.White, Alignment.BottomLeft, Alignment.Left, null, frame); + NewMessage("Press F3 to open/close the debug console", Color.Cyan); + NewMessage("Enter ''help'' for a list of available console commands", Color.Cyan); + } public static void Update(GameMain game, float deltaTime) @@ -81,18 +95,18 @@ namespace Barotrauma if (PlayerInput.GetKeyboardState.IsKeyDown(Keys.Enter) && textBox.Text != "") { - messages.Add(new ColoredText(textBox.Text, Color.White)); + NewMessage(textBox.Text, Color.White); ExecuteCommand(textBox.Text, game); textBox.Text = ""; - selectedIndex = messages.Count; + //selectedIndex = messages.Count; } } } private static void SelectMessage(int direction) { - int messageCount = messages.Count; + int messageCount = listBox.children.Count; if (messageCount == 0) return; direction = Math.Min(Math.Max(-1, direction), 1); @@ -101,42 +115,43 @@ namespace Barotrauma if (selectedIndex < 0) selectedIndex = messageCount - 1; selectedIndex = selectedIndex % messageCount; - textBox.Text = messages[selectedIndex].Text; + textBox.Text = (listBox.children[selectedIndex] as GUITextBlock).Text; } public static void Draw(SpriteBatch spriteBatch) { if (!isOpen) return; - int x = 20, y = 20; - int width = 800, height = 500; + frame.Update(1.0f / 60.0f); int margin = 5; - GUI.DrawRectangle(spriteBatch, - new Vector2(x, y), - new Vector2(width, height), - new Color(0.4f, 0.4f, 0.4f, 0.6f), true); + //GUI.DrawRectangle(spriteBatch, + // new Vector2(x, y), + // new Vector2(width, height), + // new Color(0.4f, 0.4f, 0.4f, 0.6f), true); - GUI.DrawRectangle(spriteBatch, - new Vector2(x + margin, y + margin), - new Vector2(width - margin * 2, height - margin * 2), - new Color(0.0f, 0.0f, 0.0f, 0.6f), true); + //GUI.DrawRectangle(spriteBatch, + // new Vector2(x + margin, y + margin), + // new Vector2(width - margin * 2, height - margin * 2), + // new Color(0.0f, 0.0f, 0.0f, 0.6f), true); //remove messages that won't fit on the screen - while (messages.Count() * 20 > height-70) - { - messages.RemoveAt(0); - } + //while (messages.Count() * 20 > height - 70) + //{ + // messages.RemoveAt(0); + //} - Vector2 messagePos = new Vector2(x + margin * 2, y + height - 70 - messages.Count()*20); - foreach (ColoredText message in messages) - { - spriteBatch.DrawString(GUI.Font, message.Text, messagePos, message.Color); - messagePos.Y += 20; - } + //Vector2 messagePos = new Vector2(x + margin * 2, y + height - 70 - messages.Count()*20); + //foreach (ColoredText message in messages) + //{ + // spriteBatch.DrawString(GUI.Font, message.Text, messagePos, message.Color); + // messagePos.Y += 20; + //} - textBox.Draw(spriteBatch); + //textBox.Draw(spriteBatch); + + frame.Draw(spriteBatch); } public static void ExecuteCommand(string command, GameMain game) @@ -154,6 +169,49 @@ namespace Barotrauma switch (commands[0].ToLower()) { + case "help": + NewMessage("menu: go to main menu", Color.Cyan); + NewMessage("game: enter the ''game screen''", Color.Cyan); + NewMessage("edit: switch to submarine editor", Color.Cyan); + NewMessage("load [submarine name]: load a submarine!", Color.Cyan); + NewMessage("save [submarine name]: save the current submarine using the specified name", Color.Cyan); + + NewMessage(" ", Color.Cyan); + + + NewMessage("spawn: spawn a creature at a random spawnpoint", Color.Cyan); + NewMessage("spawn: spawn a creature at a random spawnpoint", Color.Cyan); + + NewMessage(" ", Color.Cyan); + + NewMessage("lights: disable lighting", Color.Cyan); + NewMessage("los: disable the line of sight effect", Color.Cyan); + NewMessage("freecam: detach the camera from the controlled character", Color.Cyan); + NewMessage("control [character name]: start controlling the specified character", Color.Cyan); + + NewMessage(" ", Color.Cyan); + + NewMessage("water: allows adding water into rooms or removing it by holding the left/right mouse buttons", Color.Cyan); + NewMessage("fire: allows putting up fires by left clicking", Color.Cyan); + + NewMessage(" ", Color.Cyan); + + NewMessage("heal: restore the controlled character to full health", Color.Cyan); + + NewMessage(" ", Color.Cyan); + + NewMessage("fixwalls: fixes all the walls", Color.Cyan); + NewMessage("fixitems: fixes every item/device in the sub", Color.Cyan); + NewMessage("oxygen: replenishes the oxygen in every room to 100%", Color.Cyan); + NewMessage("power [amount]: immediately sets the temperature of the reactor to the specified value", Color.Cyan); + + NewMessage(" ", Color.Cyan); + + NewMessage("debugdraw: toggles the ''debug draw mode''", Color.Cyan); + NewMessage("netstats: toggles the visibility of the network statistics panel", Color.Cyan); + + + break; case "createfilelist": UpdaterUtil.SaveFileList("filelist.xml"); break; @@ -264,10 +322,13 @@ namespace Barotrauma Item reactorItem = Item.ItemList.Find(i => i.GetComponent() != null); if (reactorItem == null) return; + float power = 5000.0f; + if (commands.Length>1) float.TryParse(commands[1], out power); + var reactor = reactorItem.GetComponent(); reactor.ShutDownTemp = 7000.0f; reactor.AutoTemp = true; - reactor.Temperature = 5000.0f; + reactor.Temperature = power; break; case "shake": GameMain.GameScreen.Cam.Shake = 10.0f; @@ -357,9 +418,26 @@ namespace Barotrauma public static void NewMessage(string msg, Color color) { if (String.IsNullOrEmpty((msg))) return; - messages.Add(new ColoredText(msg, color)); - if (textBox != null && textBox.Text == "") selectedIndex = messages.Count; + Messages.Add(new ColoredText(msg, color)); + + try + { + var textBlock = new GUITextBlock(new Rectangle(0, 0, 0, 15), msg, GUI.Style, Alignment.TopLeft, Alignment.Left, null, true, GUI.SmallFont); + textBlock.CanBeFocused = false; + textBlock.TextColor = color; + + listBox.AddChild(textBlock); + listBox.BarScroll = 1.0f; + } + catch + { + return; + } + + //messages.Add(new ColoredText(msg, color)); + + if (textBox != null && textBox.Text == "") selectedIndex = listBox.children.Count; } public static void ThrowError(string error, Exception e = null) diff --git a/Subsurface/Source/GUI/GUIListBox.cs b/Subsurface/Source/GUI/GUIListBox.cs index ea5cb8e11..47c9b8310 100644 --- a/Subsurface/Source/GUI/GUIListBox.cs +++ b/Subsurface/Source/GUI/GUIListBox.cs @@ -122,7 +122,7 @@ namespace Barotrauma scrollBarHidden = true; scrollBar = new GUIScrollBar( - new Rectangle(this.rect.X + this.rect.Width-20, this.rect.Y, 20, this.rect.Height), color, 1.0f, style); + new Rectangle(this.rect.X + this.rect.Width-20, this.rect.Y, 20, this.rect.Height), color, 1.0f, GUI.Style); frame = new GUIFrame(Rectangle.Empty, style, this); if (style != null) style.Apply(frame, this); diff --git a/Subsurface/Source/GUI/GUITextBlock.cs b/Subsurface/Source/GUI/GUITextBlock.cs index 8d9b9d95b..c43a43202 100644 --- a/Subsurface/Source/GUI/GUITextBlock.cs +++ b/Subsurface/Source/GUI/GUITextBlock.cs @@ -203,8 +203,10 @@ namespace Barotrauma } - private Vector2 MeasureText(string text) + private Vector2 MeasureText(string text) { + if (string.IsNullOrEmpty(text) || Font==null) return Vector2.Zero; + Vector2 size = Vector2.Zero; while (size == Vector2.Zero) { diff --git a/Subsurface/Source/GUI/TitleScreen.cs b/Subsurface/Source/GUI/TitleScreen.cs index a79b05e78..64df0902b 100644 --- a/Subsurface/Source/GUI/TitleScreen.cs +++ b/Subsurface/Source/GUI/TitleScreen.cs @@ -99,7 +99,10 @@ namespace Barotrauma graphics.SetRenderTarget(null); - Hull.renderer.RenderBack(spriteBatch, renderTarget, 0.0f); + if (Hull.renderer != null) + { + Hull.renderer.RenderBack(spriteBatch, renderTarget, 0.0f); + } spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied); diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs index 40c510c6d..ae0f61228 100644 --- a/Subsurface/Source/GameMain.cs +++ b/Subsurface/Source/GameMain.cs @@ -181,8 +181,15 @@ namespace Barotrauma sw = new Stopwatch(); + + GUIComponent.Init(Window); + DebugConsole.Init(Window); + yield return CoroutineStatus.Running; + LightManager = new Lights.LightManager(GraphicsDevice); + + Hull.renderer = new WaterRenderer(GraphicsDevice); TitleScreen.LoadState = 1.0f; yield return CoroutineStatus.Running; @@ -235,10 +242,6 @@ namespace Barotrauma ParticleManager = new ParticleManager("Content/Particles/ParticlePrefabs.xml", Cam); yield return CoroutineStatus.Running; - GUIComponent.Init(Window); - DebugConsole.Init(Window); - yield return CoroutineStatus.Running; - LocationType.Init("Content/Map/locationTypes.xml"); MainMenuScreen.Select(); yield return CoroutineStatus.Running; diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index 9e722f7d1..95c3fed58 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -475,8 +475,10 @@ namespace Barotrauma return true; } - public override void ReadNetworkData(NetworkEventType type, NetBuffer message) + public override void ReadNetworkData(NetworkEventType type, NetBuffer message, float sendingTime) { + if (sendingTime < lastUpdate) return; + character.ClearInput(InputType.Use); for (int i = 0; i newItemIDs = new List(); byte count = message.ReadByte(); @@ -350,6 +354,8 @@ namespace Barotrauma TryPutItem(item, item.AllowedSlots, false); } + + lastUpdate = sendingTime; } } } diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 99f0188b9..8a09a75c8 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1249,8 +1249,9 @@ namespace Barotrauma if (componentIndex < 0 || componentIndex >= components.Count) return false; message.Write((byte)componentIndex); - components[componentIndex].FillNetworkData(type, message); - break; + bool sent = components[componentIndex].FillNetworkData(type, message); + if (sent) components[componentIndex].NetworkUpdateSent = true; + return sent; case NetworkEventType.UpdateProperty: var allProperties = GetProperties(); @@ -1292,7 +1293,7 @@ namespace Barotrauma return true; } - public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, out object data) + public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, float sendingTime, out object data) { data = null; @@ -1319,7 +1320,7 @@ namespace Barotrauma var itemContainer = GetComponent(); if (itemContainer == null || itemContainer.inventory == null) return; - itemContainer.inventory.ReadNetworkData(NetworkEventType.DropItem, message); + itemContainer.inventory.ReadNetworkData(NetworkEventType.DropItem, message, sendingTime); break; case NetworkEventType.ComponentUpdate: case NetworkEventType.ImportantComponentUpdate: @@ -1328,7 +1329,9 @@ namespace Barotrauma data = componentIndex; if (componentIndex < 0 || componentIndex > components.Count - 1) return; - components[componentIndex].ReadNetworkData(type, message); + + components[componentIndex].NetworkUpdateSent = true; + components[componentIndex].ReadNetworkData(type, message, sendingTime); break; case NetworkEventType.UpdateProperty: string propertyName = ""; diff --git a/Subsurface/Source/Map/Entity.cs b/Subsurface/Source/Map/Entity.cs index 61ab82b0b..c447765c2 100644 --- a/Subsurface/Source/Map/Entity.cs +++ b/Subsurface/Source/Map/Entity.cs @@ -69,7 +69,7 @@ namespace Barotrauma { return false; } - public virtual void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, out object data) + public virtual void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, float sendingTime, out object data) { data = null; } diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index 36c8dbce2..8d2a10cf4 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -559,7 +559,7 @@ namespace Barotrauma return true; } - public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetIncomingMessage message, out object data) + public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetIncomingMessage message, float sendingTime, out object data) { data = null; diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index 56bec7748..718a604e8 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -639,8 +639,6 @@ namespace Barotrauma public override bool FillNetworkData(NetworkEventType type, NetBuffer message, object data) { - message.Write((float)NetTime.Now); - //var updateSections = Array.FindAll(sections, s => s != null && Math.Abs(s.damage - s.lastSentDamage) > 0.01f); //if (updateSections.Length == 0) return false; @@ -662,12 +660,11 @@ namespace Barotrauma return true; } - public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, out object data) + public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, float sendingTime, out object data) { data = null; - float updateTime = message.ReadFloat(); - if (updateTime < lastUpdate) return; + if (sendingTime < lastUpdate) return; // int sectionCount = message.ReadByte(); @@ -681,7 +678,7 @@ namespace Barotrauma SetDamage(i, damage); } - lastUpdate = updateTime; + lastUpdate = sendingTime; } } diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 5289b6029..5b09cdaa8 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -391,7 +391,6 @@ namespace Barotrauma { if (subBody == null) return false; - message.Write((float)NetTime.Now); message.Write(Position.X); message.Write(Position.Y); @@ -401,16 +400,13 @@ namespace Barotrauma return true; } - public override void ReadNetworkData(Networking.NetworkEventType type, NetIncomingMessage message, out object data) + public override void ReadNetworkData(Networking.NetworkEventType type, NetIncomingMessage message, float sendingTime, out object data) { data = null; - float sendingTime; Vector2 newTargetPosition, newSpeed; try { - sendingTime = message.ReadFloat(); - if (sendingTime <= lastNetworkUpdate) return; newTargetPosition = new Vector2(message.ReadFloat(), message.ReadFloat()); diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index dc03390e7..ba08ee4b4 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -195,9 +195,19 @@ namespace Barotrauma Vector2 translateAmount = speed * deltaTime; translateAmount += ConvertUnits.ToDisplayUnits(body.Position) * collisionRigidness; - if (targetPosition != Vector2.Zero && Vector2.Distance(targetPosition, sub.Position) > 50.0f) + if (targetPosition != Vector2.Zero && targetPosition != sub.Position) { - translateAmount += (targetPosition - sub.Position) * 0.01f; + float dist = Vector2.Distance(targetPosition, sub.Position); + + if (dist>1000.0f) + { + sub.SetPosition(targetPosition); + targetPosition = Vector2.Zero; + } + else if (dist>50.0f) + { + translateAmount += (targetPosition - sub.Position) * 0.01f; + } } else { diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index e704debdb..e5fb122e0 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -360,7 +360,7 @@ namespace Barotrauma.Networking } else if (gameStarted) { - myCharacter.CreateUpdateNetworkEvent(true); + new NetworkEvent(NetworkEventType.EntityUpdate, myCharacter.ID, true); } } diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index e58c7b9f2..86acbfe01 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -282,7 +282,7 @@ namespace Barotrauma.Networking { if (gameStarted) { - if (myCharacter != null) myCharacter.CreateUpdateNetworkEvent(false); + if (myCharacter != null) new NetworkEvent(NetworkEventType.EntityUpdate, myCharacter.ID, false); foreach (Character c in Character.CharacterList) { @@ -290,7 +290,7 @@ namespace Barotrauma.Networking if (c.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) continue; - c.CreateUpdateNetworkEvent(false); + new NetworkEvent(NetworkEventType.EntityUpdate, c.ID, false); } } @@ -316,7 +316,9 @@ namespace Barotrauma.Networking foreach (Character c in Character.CharacterList) { - if (c is AICharacter || c.IsDead) continue; + if (c.IsDead) continue; + + if (c is AICharacter && c.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) continue; new NetworkEvent(NetworkEventType.ImportantEntityUpdate, c.ID, false); } @@ -652,8 +654,6 @@ namespace Barotrauma.Networking new NetworkEvent(NetworkEventType.ImportantEntityUpdate, hull.ID, false); } - SendNetworkEvents(new List() { sender }); - foreach (Character c in Character.CharacterList) { new NetworkEvent(NetworkEventType.EntityUpdate, c.ID, false); @@ -661,17 +661,30 @@ namespace Barotrauma.Networking if (c.IsDead) new NetworkEvent(NetworkEventType.KillCharacter, c.ID, false); } - SendNetworkEvents(new List() { sender }); - foreach (Item item in Item.ItemList) { + for (int i = 0; i < item.components.Count; i++) + { + if (!item.components[i].NetworkUpdateSent) continue; + item.NewComponentEvent(item.components[i], false, true); + } + if (item.body == null || item.body.Enabled == false) continue; new NetworkEvent(NetworkEventType.DropItem, item.ID, false); } - SendNetworkEvents(new List() { sender }); + List syncMessages = new List(NetworkEvent.Events); + while (syncMessages.Any()) + { + NetworkEvent.Events = syncMessages.GetRange(0, Math.Min(syncMessages.Count, 5)); + SendNetworkEvents(new List() { sender }); + syncMessages.RemoveRange(0, Math.Min(syncMessages.Count, 5)); + NetworkEvent.Events = existingEvents; + yield return new WaitForSeconds(0.1f); + } + yield return CoroutineStatus.Success; } diff --git a/Subsurface/Source/Networking/NetworkEvent.cs b/Subsurface/Source/Networking/NetworkEvent.cs index 98a5a9519..2d767393f 100644 --- a/Subsurface/Source/Networking/NetworkEvent.cs +++ b/Subsurface/Source/Networking/NetworkEvent.cs @@ -151,6 +151,8 @@ namespace Barotrauma.Networking public static void ReadMessage(NetIncomingMessage message, bool resend=false) { + float sendingTime = message.ReadFloat(); + byte msgCount = message.ReadByte(); long currPos = message.PositionInBytes; @@ -161,7 +163,7 @@ namespace Barotrauma.Networking try { - NetworkEvent.ReadData(message, resend); + NetworkEvent.ReadData(message, sendingTime, resend); } catch { @@ -173,7 +175,7 @@ namespace Barotrauma.Networking } } - public static bool ReadData(NetIncomingMessage message, bool resend=false) + public static bool ReadData(NetIncomingMessage message, float sendingTime, bool resend=false) { NetworkEventType eventType; ushort id; @@ -207,7 +209,7 @@ namespace Barotrauma.Networking try { - e.ReadNetworkData(eventType, message, out data); + e.ReadNetworkData(eventType, message, sendingTime, out data); } catch (Exception exception) { diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index dc58bc30d..b4c7ffde7 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -145,6 +145,8 @@ namespace Barotrauma.Networking NetOutgoingMessage message = netPeer.CreateMessage(); message.Write((byte)PacketTypes.NetworkEvent); + message.Write((float)NetTime.Now); + message.Write((byte)msgBytes.Count); foreach (byte[] msgData in msgBytes) { diff --git a/Subsurface/Source/Program.cs b/Subsurface/Source/Program.cs index dd2d14c37..1da42ebc8 100644 --- a/Subsurface/Source/Program.cs +++ b/Subsurface/Source/Program.cs @@ -58,7 +58,7 @@ namespace Barotrauma sb.AppendLine("Selected content package: " + GameMain.SelectedPackage.Name); sb.AppendLine("Level seed: "+ ((Level.Loaded == null) ? "no level loaded" : Level.Loaded.Seed)); sb.AppendLine("Loaded submarine: " + ((Submarine.Loaded == null) ? "none" : Submarine.Loaded.Name +" ("+Submarine.Loaded.MD5Hash+")")); - sb.AppendLine("Selected screen: " + Screen.Selected.ToString()); + sb.AppendLine("Selected screen: " + (Screen.Selected == null ? "None" : Screen.Selected.ToString())); if (GameMain.Server != null) { @@ -80,9 +80,9 @@ namespace Barotrauma sb.AppendLine("\n"); sb.AppendLine("Last debug messages:"); - for (int i = DebugConsole.messages.Count - 1; i > 0 && i > DebugConsole.messages.Count - 10; i-- ) + for (int i = DebugConsole.Messages.Count - 1; i > 0 && i > DebugConsole.Messages.Count - 10; i-- ) { - sb.AppendLine(" "+DebugConsole.messages[i].Time+" - "+DebugConsole.messages[i].Text); + sb.AppendLine(" "+DebugConsole.Messages[i].Time+" - "+DebugConsole.Messages[i].Text); } diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 2bad0af0a41f3b5227681a40f5397969cec98f3b..8ecac5e38b6a7ed538918d7078497a27fb720e05 100644 GIT binary patch delta 15804 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 delta 20415 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 BslosN