From 709d4efde9cbd56de7688f32049aeac0a0e9a059 Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 8 Oct 2015 21:48:04 +0300 Subject: [PATCH] Particle.FindAdjacentHulls exception fix, OpenAL "invalid value" dix, radar sync, better ragdoll sync, autoupdate cancel/retry on error --- Launcher/Form1.cs | 2 +- Launcher2/LauncherMain.cs | 21 +++- .../Content/Characters/Moloch/moloch.xml | 6 +- .../Content/Sounds/Damage/StructureBlunt6.ogg | Bin 22272 -> 26346 bytes Subsurface/Data/SavedSubs/Aegir Mark II.gz | Bin 11341 -> 10500 bytes Subsurface/Data/SavedSubs/Vellamo.gz | Bin 6255 -> 6844 bytes Subsurface/Source/Characters/AICharacter.cs | 4 +- Subsurface/Source/Characters/Character.cs | 13 ++- .../Characters/HumanoidAnimController.cs | 4 +- Subsurface/Source/Characters/Ragdoll.cs | 35 ++++--- Subsurface/Source/Events/MonsterEvent.cs | 2 +- Subsurface/Source/GUI/GUI.cs | 9 +- .../GameSession/GameModes/TutorialMode.cs | 3 +- .../Source/Items/Components/Machines/Radar.cs | 23 +++- .../Items/Components/Machines/Steering.cs | 2 +- Subsurface/Source/Items/Item.cs | 30 ++++-- Subsurface/Source/Map/Levels/Level.cs | 25 ++++- Subsurface/Source/Map/Submarine.cs | 1 - Subsurface/Source/Networking/GameClient.cs | 55 +++++++--- Subsurface/Source/Networking/GameServer.cs | 98 +++++++++--------- Subsurface/Source/Networking/NetworkEvent.cs | 2 +- Subsurface/Source/Particles/Particle.cs | 54 +++++----- Subsurface/Source/Program.cs | 8 +- Subsurface/Source/Screens/MainMenuScreen.cs | 87 +++++++++------- Subsurface/Source/Screens/NetLobbyScreen.cs | 49 +++++---- Subsurface/Source/Screens/ServerListScreen.cs | 1 - Subsurface/Source/Sounds/OggSound.cs | 2 + Subsurface/Source/Sounds/Sound.cs | 4 +- Subsurface/Source/Sounds/SoundManager.cs | 33 +++--- Subsurface_Solution.v12.suo | Bin 766464 -> 759296 bytes 30 files changed, 354 insertions(+), 219 deletions(-) diff --git a/Launcher/Form1.cs b/Launcher/Form1.cs index ed2448611..01d7e274a 100644 --- a/Launcher/Form1.cs +++ b/Launcher/Form1.cs @@ -285,7 +285,7 @@ namespace Launcher } filesToDownload = UpdaterUtil.GetRequiredFiles(doc); - + string dir = Directory.GetCurrentDirectory(); filesToDownloadCount = filesToDownload.Count; diff --git a/Launcher2/LauncherMain.cs b/Launcher2/LauncherMain.cs index d24cee5a8..0825c8119 100644 --- a/Launcher2/LauncherMain.cs +++ b/Launcher2/LauncherMain.cs @@ -98,7 +98,7 @@ namespace Launcher2 // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); - GUI.LoadContent(GraphicsDevice); + GUI.LoadContent(GraphicsDevice, false); backgroundTexture = TextureLoader.FromFile("Content/UI/titleBackground.png"); titleTexture = TextureLoader.FromFile("Content/UI/titleText.png"); @@ -550,6 +550,17 @@ namespace Launcher2 textBlock.TextColor = Color.Red; //textBlock.CanBeFocused = false; + GUIFrame dummyFrame = new GUIFrame(new Rectangle(0, 0, graphicsWidth, graphicsHeight)); + GUIMessageBox errorBox = new GUIMessageBox("Error while updating", "Downloading the update failed.", + new string[] { "Retry", "Cancel" }, 400, 250, Alignment.TopLeft, dummyFrame); + + errorBox.Buttons[0].OnClicked += DownloadButtonClicked; + errorBox.Buttons[0].OnClicked += errorBox.Close; + + errorBox.Buttons[1].OnClicked = CancelUpdate; + errorBox.Buttons[1].OnClicked += errorBox.Close; + + return; } filesDownloaded++; @@ -557,6 +568,14 @@ namespace Launcher2 DownloadNextFile(); } + + private bool CancelUpdate(GUIButton button, object obj) + { + downloadButton.Enabled = false; + launchButton.Enabled = true; + + return true; + } } } diff --git a/Subsurface/Content/Characters/Moloch/moloch.xml b/Subsurface/Content/Characters/Moloch/moloch.xml index d9168a7ab..3f9a40f45 100644 --- a/Subsurface/Content/Characters/Moloch/moloch.xml +++ b/Subsurface/Content/Characters/Moloch/moloch.xml @@ -46,15 +46,15 @@ - + - + - + diff --git a/Subsurface/Content/Sounds/Damage/StructureBlunt6.ogg b/Subsurface/Content/Sounds/Damage/StructureBlunt6.ogg index 3593d8bc8a9f6dd32b67ed3fd37244b3d37e2f97..b4390c6dc941a5689fd8aef262468940c51e3455 100644 GIT binary patch delta 25103 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 Gs{sHk*>{Qn literal 11341 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 P@xS~RJlr%aOsoL_+Pg-F diff --git a/Subsurface/Data/SavedSubs/Vellamo.gz b/Subsurface/Data/SavedSubs/Vellamo.gz index aacaeab7f5f002673c0b37453f31986fbf73bc12..64666757dee3a5eb8432445872d457926c7cc8f4 100644 GIT binary patch literal 6844 zcmV;t8bjqDiwFP!000040PQ_#bKAI*-?wW2gUX-f32uVr%&W>V*Q?A-D#_ba?Uz@K z%(1nRB`-zg*k8Zh-~mu1D3YRVS))o6E0)-3^o>TN@%;Vf(_NIzm+@p7-Nip%e2Eu} z=x%i}xx1FP(fans3n}>PpI*IuO)2N>ryzV83iUJlIebAld#PW%y!gj|{>NnU{C%2i zX6Ys=0Ikz#o~)Dk&24%y`Rz5pxtJvJEdBA~QVKB*)s#s!<&0cRo;5@GbaNjq^g6W^|q`Twn!X|(th%|2()lyXoK+MvWG%ue~|-R1^RhNLiOze2J5EK8qG#=gaHW*BnYvLQ#UCa7__fo4hxI z(G@U4iJf3-1PLny8A4P1sslm>yFnNszh6Y@U#sLUhe9nBtqla2$4*Vz0>Ual=uQ|l z5o4kvV_hcG#2HqSm4R#+i#CM8oLij>;CZ13!m+cWoOQ#eqWnQs_kpk!>|>kmH=syjx5z?xjpI|i1@nok9kLF>sVifN0*Y0wcBRJ=+D9q|WoVO?Jaf(l5p z;0}UCo5gStEZ%4z2Z0iG37}NA;#HM^z|vcQT|&Qy61`IZ3h!lcp*Gk;8>JO;4gFVl zK&*gNB83r~*2F*(Jy0qj*`SG`fMYb;7pVeLX@(ibJzXI+agEv-N)VE-Q965+z=p;& z%rpc=sIx(>I;70G8<)^W<8@eZO2)OyVKPh^uVcgqDg;2NQ%AS1C#%kmZ`=1>!~ti$ zSj|4ai9W@}I@>kN#Dq>^IHi7@JX_t}Maydk1Pp3j7L1SfftoPLk4KWMzP_=`7Qw3! zMCN050C;Bued@$<7*z*q2Y`5aGhfDWGGE?Qrefmz6P zzBtJak*y?gUM+f7OC{0J@m`W=6vZr1TVz)CUd$$tjQh%#e@e9auWb-P1w@u=*Z~3w z>n>(()N+X^1VCP7jrPxD8-fj1C5^`_g;saVv)?erEXg?BUk)rG8T_vg~f3u)qd_ zjO4?!_J!)!Qo=^aCIZEWnGCC;yLxR~5U-}3)S0{@+_qggut0{{JxY~lhFfbeRyT*8?1 z)$%P)BmXsgki`GHnJ4k}+#>samc(DL69AK3Ow#Z7h(CPk{yx5j0oOM_URb~YVZOZI zr1_%;!++107v;zBg~fdNdGZy#0kGo0&x_|K>1vW}mXq{0p2WF;l?;EDqx1j*u-c^C5&*wy76C%4jLV+&z(Oj< zNrYNxAo`?keY-JKccsL5njkQaDPahX&8EtR-gY(5$@4lH=RDujmVs#+UM z&?+?e?1O7)y1Kbpc(kgjpYA8RMc*1Ucb!IQ?3WSqah0RJl(vcbPHso*CrEr6P!I8G zz>b{w)Y?njLcGKv{b>S z$|Gb?lK8&m4GoUn=s=jhXXQp;=hrFLE@KY$HpVR|tlERmzXD3YBb!aPU|0qQ ziwF!HQ$kVzLdtXnBr`xv>ur1}#fqh_aFl_gG5uTxqeu^I0s{s2b+*BnD5WEqkmg`e z+`nT1hlQg>cXYyRQlZGeh|q#D@4JG@W`&jDHFU5ld>0@`wO?-1bhXU4t!=grYd0=K z-`a1IMmKAa@VjWSK!v?<)H_X9i$$EYYW8ohC$FNUOz6Iy&pwwr{jWb>{OiN7f4=+e zzkhl?dGYGiPw(GvS*_{_50=DT&u^B|!k@+6PKtC;XyoZ?aUFeH#FHpZquDKHU3X{1 zKPK^VcDr*1&z}|0+l;#_0hHK)2KV01BG5|&lsW|waMBnoFS#_2sDYn3HSj@ zRK*IMMWB}m$nX?IpxhD;!?Pdg8w>`gAOW`QT%Uu%zHZu4v3NS7Ev!5s8t$0O&M@HUa{;r`dJ3L%K$xrVgW|n z1Ab>2=qm&I1QG+x$qktfeBL8NXAx)+f$j6(PelaYZtm`jc+eILn6vxdqOoECe0Fj- zUw&CFKqLSd`2j$fQ_{25at)v2gz?Pz(I4N}-H$?cIJB0{wDl|N`xtR<`9_KzThc}R zC0=-N9;;D+D+6VEP|~)#!BZ50?k9wfMg)RGh(MVi zX@o;B=6CaSZ5-j0W6@Kc$p>k|GyMpkjogXHdoW0JKaF+2TF-GZes3YV%U3eLxoLAe zEhqH$5D(j|oEcw^+Hd7!SJxkpd|YBvwI?kfO!&?SGui!|>Mr?Uay0p1vPEo%$j9W( zD!Pt~78|x@mubm}TS29ipoM9b5(M7Za>!{nw7cU_GhVjiKXzX;83`-Cc-fBfRU|QlPyF@79x!+u#bB_CxExgVL8tw$+)rnZTTcJasPB?9N_X zs+peQT>5>!oc|u>k*Kn|&01^Hi;?oD8@vuZs%1qZ5qZmb1jGm?xg4YG;8ncr`)^fI!b)>J}UZB-Tk~bgx;&!JpJCPWaXE>we0+~W&OPX zzqi=K{^f-pDf#DSX}&mlx%yUELc7x&Vq#{#h}?kPzF^R4~-(!iMXN<*7Y zo{ThziZm#3I?^Ehob_1^#(llhwxpr5qWoJ}ji4eYCJAsNa^kld)%dsaiLcEYW8O}) zyzL~}$;gSW$jPNX9XV-{1~1QL+dB7Tcy1d9Qgi*o3Gv+9)y``HsPfx}w)ONL($F{< z^*SutR=0Kx0%h+%Gy-)>A*x@XLT^yQ{6UF-v*SR{rmv{A70VxmsL_h3osz%u+M%u8 z(aPG`yPn>zk2s`2Z51|D(C|t;^_$&3H#0nj5Zdc@7{QBLPsrYBuMoD_JKuc)Te;Lq zpf!NUgT+%nS$oH}T&vo-EAnJSjd5RmelTZvOi?(qU5r6KPilqExHo$z9^4>29?#!z z?&D+@-AA)|d7l&I<^Db1(ItaU>TI{h@1k!Ris*WdW-rZCx#8FEmfN>RAaPkYhj$X3 zGKu{u)2*_qkx9(#&7h|Ce0OEylO=JB#S$$wizATO)~p1qW)~_fXhIcP4oYQtv>BqvtIr}T5xhD59 zuy9VH;}z78f`!=yEHzG7<%7z*@gFy(lc!Kmov$^=@) zS*BjRP`E(|OXeUPPR%CK==1~|!LAC*_Qa37c0gi*{MaOQFhnwj>dIWYo4*r8!vWPPWg|<0W4R=|f>`Ow z_~PtMhIv1Pm4mPXglYXW%Kr2;iZ>8HXFof@a{{EkSlSOk0^$h@Ppw%(>+mkcHATZlt;=Gc}L$hIw{o>%JJ0h>MX8kyVnC zmz;?F4OhLDggHe^Aq3Q>$@i#Is41>q(PL@|K#aEx8Oh&}{t+v4OBJMqFl4M{lB+k0 zieX_0vlk}|E~c7{j2#Gk9^0XTH!&T?dHK&k=|Qm_b8Z|KRD-P?c@a=Y`?82hhbfxP zUrG63Xw?UYPds^##!*?*&Ok9yGrU2jk2l{=c1O_ppr)bzK zd8r1x>1b(*x=GW3E#PPfUA`Gkac5naN3d#SAKSRLB{{uePzk?tj*NCh+wKAd*o{z* z%XM2tTx zrC3aP?LO#nq?oH*in;13#U@W!U`RvIv+ZUp`(wy4Rv4^j=H{{z!(hsT?F7p>816$u z#}eRmG{JV*wKs;B3}OMq5EH9IFtnS5DkM|0OEEHr;N&t4F|{%PL#LB}5Khg`*2oy5 z4DN%W-BZz~2Td)JHUbg32{<4S!Ep7G?pz1fkhB*g;l58TQra6u9cHQ$$|0H(INPk$ z#3SRYiWYi58U{`~`2ZFrWPDLXWih)YD2f9xbne5|fJv=G);P+t4~962S4m7OTlqp1kW!e=c7EJaj|A|}X-Lg+L)TKo| znCkJJ&jC?)tU-V$ea8L@c*vlShySyg~Z@n1Z4-|Vg&Mpq-cY16;Y~jqPQy_z` zfr{-6+6b-z_e!#A1Viw??u$`(lUzd70YZS@8_zWqotOoVjGYuzwMP$yf`;}-pt zxl&#hP?RMVve^3#RiC}z+T@)2Mu>jESd8ut0WcAJ84H_#V~XLTrgjC{{({Z|OtVsn z`!Co-((DN2`vc6dp)b--&O(I;F(8*9>g>u$j>-fC-a#llfWpF3m_V#<`g%Vwg(>T6 zOSDU3#v1lq#!$^nWRbL)&+Ch%TRt9y4f_;hAjx!&q$GtT6t-fh)@f&j2`jC`2(W|r zFeH_$Wn@ank1JgfkeI{FR-LGE*}F~}_a-VktA{rIftPEG{&%Om!BZZuR(JQSWxPx$ zNwma%>)F|Y1%9>-sHp+-G4)^eoXlxCs5j}|mVKQ@sXNI&hZ$V%u?qK8P~Y%7bFbbU z?O3>HjarB{&3ioaZ^S*{rw_;#RpH8IZ5Qv%mB-+Uts%ra0nWPOvvlkz{gke7?;K@# zxz}>y@$tA9R=9VLGQ3g7sCTiA!#!pXyJCm+v*GkIZ`51V#$sN%Jmc6+@N74I%xmfK z@p#O$wM;~wpUhW;?+L{qj;odoB>DGGgSh#1e_5ymJb|s37lRjp7l#*}GKrU7)laom8{1?f zmIF3l`P0Tj#JYs0xd@~uI8HQV|ny3aT4N!GxL;4Z~?yfe4#-(*aB(Z0zV2sd5f{kl9oBe|b2@Mq; z>8uvfS7K+0S`AY!oqa7KNT$OLsA|GPHvTE6285j5Ky16yboI-_BIN9=N>6XvheXIk z)J6EC@Tg@oK6?w7?f*e=4{~QcO9Q6PDOLvNogE0%OS2h`Re9Zd?lfTPhLjMLkOL{K zQ!K`aY5#(rGk*hA9-zX^-jxb;pkQq3w=9oC9OJ?Ft5A{Iemd1fnaPRdqcl)B;7awJlo_Nb& zLwk$E*jZFC^HX%;eI>xptgO?$2BHA(Wu{#b?m95H6uX2VS5GfZbUE7CWehCx09uQB z^leUkw*}B53!rI;C6wFIH%4&n5%hn-I=-k7wA+bVldP|GdBb*CKYCwXHzJ^R0=q+% zEG1c|%L9#L&kkQwtOcP59LhPk4NHP)R_u7F!JG;urVl%>(no|s9CoDA#&aSXyV>jm z+*;!R=5bJ=)0LsjM8+KI#qxSm=HQAVNw;l)0*R=Vud!>p5Z<&maq zBfOVU>#c3O;de(jh#Hqpr((@Ol|~n}M@a`e;;{28%>R{s>>HL8Zsdw~Jsqs0z4w-# zx$=NqaT*2UB@0cRtj}CIBv<}erFCb?s(Hl$&Jw`>J)Nb;JyN2 zc{5+ewzPK(NSJL7nZ9N%P=1eRx6yJw^FhhBiOl+}1A2vwX>-m@Y z@@DdWGf#_i-dkIyex)z78gZ0VZEVZd=8mjJ4IlT+7%mqd86D=<=R^4L0O*u_S1e~c zEm9cHr8g#y>3VriA&5a84l^s)&hqm6GMSoHF~OhsfB3z_w%>^ase;y z&QnNil?}ht*bNwd1_RKyt(Rdbtr|B?$3dUti@Co5$~$};g1e*hj5P1~j)Hva-vNkI zXK^7lUhOj&aacZLCnLNwp&+cn7ir;ys~ddRjTnviJ83{{Gr0%;jDd0re3=Go*amLO zI5uC#Ob`Bq|4VEv1mYqoW`D5BP^Qv@S;$4z*#<4V~S0jC_Dt z!NpG@cVfK_UPT}y0Asg;*%;pHM>lE?J0GZv~5hBh?t_8dOS=V#|Tjk*ynxs z**atLb`b%v$*T?C2UwsZt9G`(&8cIvRXN*OEbA?)d>7wG^W?*7)xOBD*syGUUx;k6 zz|X$|%fio-0)m@ksExFT;D3x4*Ql8Yt)OgB4WSz@xjRbA7E>{D+eY8wi+|x4ABw;Z zRvDFThCaZ(puMTwb9_ejjTZJC-$p9|*frKr)^gbKSv7Jv)coH>*Vl#760|aAKrmvN zidqZc?Laq!(Y8D<(mUDpv)}XFS-z}RNZYRY9Zib-P7bM(;32y~IdlIV^m7(1Chxx| zz=EP;)Ru~vEAQ()%SWPo^XRt7E*t$&diOF~UPpFRYDX31!A7;!ZW<3DG}H=@qhon? zJR8*QSA+|!{#_)xjr!_ROkOTlvqGcoT}xDQG7Y;Llxh6!ez97E=jpj9*hawKO7lnv z*z24g2!Ypex?0*JFWkAF2~!aLw>RsNLkG`0dDv|h6QvA4EwoKD=Yl8&f$W)PjrpR@ za`FpUndrK(ZNiqMt8h^K|KT=SeeFdMXGILT%&ZcT# zPBAja)<%}RG?mN#`t1fU07QZ}QI4#rCK)TX*=%%w-RN!rji>LopKjxHxlU&5_%?ZV z@g-TU;@i!|?Di_SiSKWoT?CB&`hvZF{yco~;?;{+eiZTN(d%DdF+pAg(Q9_`xBvW) z+3e~2EZr`$ZCVn#&*EizpDwR&vWwa8uYk_QEKL^Kvx|AaxfcnK2Et?1znDE~rm$Eg z@%q#C*LbzcDTJB?34HExAR-y{D0dTC#p!i&vq_i#w^?WL>QlV$`ZJtnLd2h$a9Oa11%R6@DVbQ zE(1yT9S{wpk^=PwR|Jr!mI3WNFU#kNgy-=2NDO#9tRAPu>p7PLo)_iwp^*9T#gNAX zJ^K7{&RVr;Js#3Z`YfP>A7=)bh@TH$P~P?Ya(%V=TJq0J5)xz&JP;~9={Aho^Q?Sc z@Nonx5s(PjA48$C2oe%Hib7=sgpA`sR7No8{RC-SH5D4h94#9DDm=GY^)3lvkw88= zNz|MriMZjQKo|u6P%x-b-ZC(~rIbi45`J&r!lc0qh;&X7+^FOhgfBL?xAFSwP5db- z$HXf-==VW7N;yP0X~b!|`T9;zLNITX6p(*KL39#$ll)aa&m)V2P;@=NOjn!5XKN4@ zLL_PyNJP;f7AknmDX2mOT|6Y~Ynb2@nB}i6KD178Dpqs?Hb|P>z?ks+h+}sw%o%KtBZZf~afPTe(IFjsY7OfGX^$&f1XAIZ`{3Lq zMn|2}_>!dAa$(b{AV)En1@I#wKwW=Iv?QhVjp5@yq)4SG4kV;Pji+pM;P6Q0W*I14 zDjBu1WKUo^kW}+m2+^?$)5pZMq3L0yuhg%?1KOsS z11KjyGY4ck1tbB42)+s@+q{k)uh?9WkxUr#o=RnDHye#~m@$}u7RlsrI#d^jRDGle zJGBa+j=oe0FbKOXt^p-F_EHl|H&B~s5Q|0+i`n%aR970X+SX?*yCihDrbzU0Kuwy_ z!5T&X!}CyWu!2cwk;&^8?PQc{4To5%m*SHc$qsbMgjy2mQ6sKlEV3ZhN2d0?V$bjm zWB5HwZi^>htGv3vLtvXdSS<|Z{w`f+$zrqGq%bB={g>Cvfl~hX>~8ZlN$-*r(78x( zz=wY>@8ds1P5(u-O4{SNtuU%I!cFPvlcvEweS+$!Ddx{D#-r)%T>^sJq=hFmrUwo# zjI%BU6_3wulT`+GvW6GjVX2@&C#|CYb(^ea?>1MZ++SiW2&yjyuYO)WH_JA&bi1Bq zH_0q109GmdNx{+s0ARDtb`b#IYKDOC+ltGdbx zQmE-{QHmFIPSA#{Ka~+T!{(!MhoFL2n-Vls?!*-64qHKk&px3VTi5ny8$F@cX8Eu2~g%RYV#frx!d?I{@@QI*DF8sh)pM=cpF$&*>e1eO8 z$1QxlOhF$f@I$BU!y}hHk1VeP`Rrp8eh@jm4moz=8%00)D1{$NC-S3X7e2Lw{}|m4 zcOw7TT|Nsfw=>83;?WA<8MOZp(UB@tk-mSH+z`p>q*xMh5buKjde*P`6CoMB`(BMDi0&{#+ONMzsxH7bZh6g?P`@*TmeJh(Enf+ z>3hDe_H}uc;nriUq244|-Nn@d`1x0033Q~Zxta{k$>1ulqN7%LOF}4_zJ!9D5S4P5 zA40H>+?S3}bR?D;Z8E|iz)h&A;6{pFGAcIiNhTr%8HD?H+zFxSNZy~Fh!s-yLs}!m zk-5Hva_K}o=Z8lInP>o+Ts(7u%HCmz`m$47hL3o$&9cq9SVhofKivH?k6hE@EQ_!2 z!BlSJ)e0^D!tfJWx>>D~wADrY{%ZCzPOHlB+vVbO+uV&9* zzI^@u{f_&y-|%47;QQtEI$pWU!MhW056^%)-K?(SPpf1WXIZ?s!SZc)Y5ilGtQR+( zBY66xq~115mGQ=m`P3yD0QHAz&8&^ZmwW4D`o}Dm85d%bTO_{5sW%3Mx0TH1Xo+}<91oVQaI-7Tfz#s?&rvL%p z@&dwHJUT<5DKCs3KLnz{asp=r3`4*PgaYQdS}M=ez(53?!ZcvihE#`yGXw@j0w+)x zAi6e$=Pb_%7>0oG6cA8Vh9W$;c1FOUY2YLfVD#w-={Xi027%xNvH{{(=>TEa59JJj zLGu7P1qg7<3!Eo{VGuZhwc>zTPT-7yVF;j)9|6Q?R$=hGLNqKIJc)ULT9v^w1cpK2 zB)ouLA;QLi=WS!dCW1%0SK#gT_O4tX(vg5_0^kHd`2u`)cDr1E*{lE(K+OLINT}o1 zi_Q8Teu@Le!|O-i2SE1UZr|f5L_X5?(-L_xS<=}a$jsqqJbXCB| zb3D^x;J9=y`k!d~5jr1tSisa}mEN;9cmBAod5;524`QX1ws@A&nys>SY)W^ks%>_9 z{m%d&3j|0wm7{(aFIU&wYClI+!^dtvQ3OFKz7m57f*pNYA@O0Grb#wSH(89YUM+8z z*}a+wJ%(kCIyer}&Byx)KbyFvkMo2P?|-c8ZgaoH!MJhA`{OWOUSGFCy5(^19`Mjj zzEtZMuZf{}X6k_@KdL_@F@xY{%eZ_GS}bCFL1f-TO=R z<0DnbXJJiMlYMgB?xa z2U~Qwor;^~Iji5z`sOIgeGGpvJP{AGEqrtR5>B!##?F1x#G zd8*rKI_3F3%WqzAOYU8K6{jwFAC-KG>_5FjD8E@Ov+u1gv-+iPEyqXN%7RXU-&_3V z@VzGvl>B46R=+rVvH4bdOuY&a;cW+g*EIVU1^yw8*Y|&c)BF+URqyoJr^}=H6YA_Y zC7qEXYug35%T-Z2_T79Jzd<^GgLeLg!PuT?pt^@%(F^)y&_KCUvw;gI)SXxE&deu? z2Hl`swe%L9(bVHX1EVg@^0u|z6VWWu7mH9IJJ+9(*O$(Ac9GN0sjDr}PJrh2C)44i zM+jiDK}N9gpitw)aw2niI#3f%s0nv~;S5T4%iISAROp)7c9s||s5xz6cfsTMKxofo zr{wPfXXDxyf9L8tNtwHn{($hL;Gp3vS$`B_~3ikw*&}+)l)a6ZSLYamKA%TwTX^ zIykZI+|sNwu3_%D#_9k0Pf*t*#;t0IlT(U+-TuT`<)ze(t&^+kz2Dv?=_0<17t88u zDZ;8906|2(AnLkVO2I)duHVMrau%_EbTq4Mj=HbA(${hk*xn+h`jSg^DP#ABy~itJ z_x74#s%>!1A~w!5OL@{F=FSKx@DC_rqT7#S$M;iq6z+h7?1$p2_j4%h*4SnbX_&_P zH^;^jw@JwC9NveJc^oLt;D_JKOOA~zv?%tGb{`7sRya8#g^!y$ZQ+#sD8;spY&Z+}cm9&ujY`wWk?iFw&{!4JlxPbpF zOzFLB-d5|DL?+n>r0I3N=E zzXSuB*7Kvf{}_uZlQJzR1khkYnRkS`y-RO;MlJ_rnK^LVyLO zmvaV;&q3OAyi>XOL;^sFvG1`b+j@B+B$1~IrIQLeprR0TAmkK+HtviIDFcq{3E^HG zQ(rQ)vP-4rDH`+e*WYw(_H{BrnQehmTC9HcJAK*KW^mxI7#!NhE% z6S@=xK#Ly+&l-9y2qp~xEun|=z-V3oR|wO~FLOeN@@s6sC)8tnVs;I$09wb{m@=Oi zADFl_uRZU_uu&%mh6S70jVW6~hQ}EdHJb6GKpQgDaqJCXLM;QAdwn2uVUsao+6c;s zQ1C!Xmz8!4eGihF+Jjkzhzxw^)JiQPKnMjTy%hd1%&84V<&Nq|fRWU*fQgKR5Soh- zeWUsi;CBWZiP~6FIY}R;&WWQF^yoN4UWzaesNgl_2Y?0!TLT$3c54I>1j?zsW?0PW zdE7b$%feXoS8=O9wUzlOT*dRgtV+$Q2t5^vP3{j=gsnaejr7!FU!{HEZ|XTyxpGXk zR05zPQcM!_52F}1PKF6cX(x~V3$DfmAw*|^+$Wx76T7Q0kDD=?1B9xGt_Vc&tMvU* zksUEIK~7*2@Fzw=o$Wb#*wFzr(M{Fn@HxQLb>f)cOkE`}5>}Xgicj3nLq7OlK$L%z z0}BRf1-=qGl1A4a7d+bmyw7-RC0H^ z+M7kN7o1ip+Kei%ma}l3D(%=Ro!^3mFXD^h8tpqWpWSJDdI>BWLoz*K&yigmmdJU z1Z_=41LG`APhF7a5|7o|hfHB$Rh(i*GF5QHs<6BY)Ppi3j>M3RxHh;d!^{^MCP%oL z1eNJplz)vxpL+5x$HYi51BfJQ>mvK(yjGm6#N9LTsPSxOng?+tgLBOqi)QW?c&f|C z0a#S!v5_2F7r=uQ`Q$9lRpo9EXQ9rgRW(MuZE*UDt}t|?7=|lL1FDQQo`q4e!F~0U zJGjO=ljMVnH#M%Su#&UTlheBa5~4d6YWbW(HjFC?YOSXDikVTrjK0P?*Q^JgoPN?f z9P6P@JTVCgTo87Hg9^6_*7!ZKiay5 zFl0!Z7HB3=GZTBt(73EKj6BAthoUHaq=MoIF>-4nWc)A_;XWK16gXoz2pCjV+w>O~Whv*)E}`-mJ&en$>Y|q~!$8Y;b4i z`z+4PK@QoathGn=6=`^6;jBHU_Ux`X$D%!byO|#dPlT=$D?hvT><(DRqCIA5?`(Tc z+Z)hp`r))kE$yj{`mDVs?H#45tQ1Xld{4Ii1=&!d#t1x~dz6!kgF1KtG}O zTt9t4tpt`<&Ng)%TA@}|@*HJ2ql}};t^fJ$`*pIO{XJPHX{?*FM0$w>?`%+A-^zQE zs0chNq=#J!sPN%0gTKV10bYkw-_LJ1tjJ$jy|4L_k2Vz|^8+qn8n5(;?+IzS7qnYr ze~<5qy;^?Wn8nAvMBnie&Z;kqs@RlmS#<5qc$V1D(s0Pb)P6W1Lmp=8;dwyEJk0Hf zhp`>l5BHFlX&uS|S=%~^QMwNx6mK}|^b3!Ch#Sa6=a_wY$vaoC>YVDnN=)_RYdB~# z1*691L+YyoS$O76edT-{TE?|SL_Cj(Acdy&a0=u6_K@hmATKLVMoBB(3qtcQ z;HZ9@+D-(JP`h-ER~a1zLeBFpJcoK!V7)4c4*06ddEi~!O|6CYAzoRxM3W&09EOqh zQ+e1|8SNt>F!u7phlhHZo-ZjbHXm?Y`joUkJ>s6PuVz(Er99ng2r|H%kezpTJ3SSU z)s>pcomT!U&a!xMgJVz$d~4SIF-_Kso6dy$>64QBkErJqU9y*J#|0p5H?F%#Q3t91 zm2fNoWPeVmIrPb z<`al>eZ5>Ky7aw6B+6@Ls!3@Jl|PcjO}t(%TvYO^nTl>&s64;FU*2c&I&+aJ>SvM6 z$5dRTVbWP%E#mYlw}F@O9o97~Vp`5oQA-oWu*@FM>T}N)&onBcNEPPpHj5_ykRH#k zmS6Bb=l9!XR-VK&_Q-y^&PVpyj`Rj||>KX@bfYW6bz1S6<4rn3tbz;?F6?zJ$$NZ>JF znBNHD8xsC9_)9%Tu@iyssfgUiulR5HzP=XDl?>Jg!H5na)m?4fm!msJK~?jKzJFA6 zO~Pu+A??dRAL8}rf^)NrHYtMNy)s$&&fDeUvm>`{=S4e{Q1Tzli;iX_z+=S9^Mt(U zAYS60Jm(!=lk-w|v_IneiWhG10&;2SliI<{0X(kBpFDE@#1H4M^6XJLMFc*tg$AnV z)Z4TFx&@#3ZgW-oLn9X;kajZmVCJ*Si7^F(ZwJp@@AURSoEV`J%*hWaleeoFh|OMZ z@fM1boxpbdQ#iPtZ5@p}Ih+gr?~=QCnSR)8+H)?;J?80FiTyI)Dt-l`^v|=Bf|>Hw z-n55>e@s?aXyQn%lx%26G|sDTj!d%UP!w+49jbpWFGn$BznAdxP3R+&S~tv Z=joI8+fTP~3PAkZ{{v2ocK;6Y004VYI(q;B diff --git a/Subsurface/Source/Characters/AICharacter.cs b/Subsurface/Source/Characters/AICharacter.cs index 90b78a7c7..874120463 100644 --- a/Subsurface/Source/Characters/AICharacter.cs +++ b/Subsurface/Source/Characters/AICharacter.cs @@ -107,7 +107,7 @@ namespace Subsurface aiController.FillNetworkData(message); - LargeUpdateTimer = 10; + LargeUpdateTimer = 50; } else { @@ -123,7 +123,7 @@ namespace Subsurface public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message) { - if (type == NetworkEventType.KillCharacter) + if (type == NetworkEventType.KillCharacter) { Kill(true); return; diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 332f0ce47..20c15154b 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -741,7 +741,7 @@ namespace Subsurface public virtual void Update(Camera cam, float deltaTime) { - AnimController.SimplePhysicsEnabled = (Character.controlled!=this && Vector2.Distance(cam.WorldViewCenter, Position)>5000.0f); + //AnimController.SimplePhysicsEnabled = (Character.controlled!=this && Vector2.Distance(cam.WorldViewCenter, Position)>5000.0f); if (isDead) return; @@ -839,6 +839,11 @@ namespace Subsurface } } + if (GameMain.DebugDraw) + { + AnimController.DebugDraw(spriteBatch); + } + Vector2 healthBarPos = new Vector2(Position.X - 50, -Position.Y - 50.0f); GUI.DrawRectangle(spriteBatch, new Rectangle((int)healthBarPos.X - 2, (int)healthBarPos.Y - 2, 100 + 4, 15 + 4), Color.Black, false); GUI.DrawRectangle(spriteBatch, new Rectangle((int)healthBarPos.X, (int)healthBarPos.Y, (int)(100.0f * (health / maxHealth)), 15), Color.Red, true); @@ -1100,7 +1105,7 @@ namespace Subsurface message.WriteRangedSingle(MathHelper.Clamp(AnimController.StunTimer,0.0f,60.0f), 0.0f, 60.0f, 8); message.Write((byte)((health/maxHealth)*255.0f)); - LargeUpdateTimer = 10; + LargeUpdateTimer = 50; } else { @@ -1115,6 +1120,8 @@ namespace Subsurface { if (type == NetworkEventType.PickItem) { + System.Diagnostics.Debug.WriteLine("**************** PickItem networkevent received"); + int itemId = -1; try @@ -1126,6 +1133,8 @@ namespace Subsurface return; } + System.Diagnostics.Debug.WriteLine("item id: "+itemId); + Item item = FindEntityByID(itemId) as Item; if (item != null) { diff --git a/Subsurface/Source/Characters/HumanoidAnimController.cs b/Subsurface/Source/Characters/HumanoidAnimController.cs index fcb959d86..240b00281 100644 --- a/Subsurface/Source/Characters/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/HumanoidAnimController.cs @@ -214,7 +214,7 @@ namespace Subsurface float walkPosX = (float)Math.Cos(walkPos); float walkPosY = (float)Math.Sin(walkPos); - float runningModifier = (float)Math.Max(Math.Abs(TargetMovement.X) / 1.5f, 1.0); + float runningModifier = (float)Math.Max(Math.Min(Math.Abs(TargetMovement.X),3.0f) / 1.5f, 1.0); Vector2 stepSize = new Vector2( this.stepSize.X * walkPosX * runningModifier, @@ -229,7 +229,7 @@ namespace Subsurface } TargetMovement *= (1.0f - 0.5f * ((float)limbsInWater / (float)Limbs.Count())); - + movement = MathUtils.SmoothStep(movement, TargetMovement, movementLerp); movement.Y = 0.0f; diff --git a/Subsurface/Source/Characters/Ragdoll.cs b/Subsurface/Source/Characters/Ragdoll.cs index d40e3ae07..58bf9a95f 100644 --- a/Subsurface/Source/Characters/Ragdoll.cs +++ b/Subsurface/Source/Characters/Ragdoll.cs @@ -384,8 +384,11 @@ namespace Subsurface foreach (Limb limb in Limbs) { limb.Draw(spriteBatch); - } - + } + } + + public void DebugDraw(SpriteBatch spriteBatch) + { if (!GameMain.DebugDraw) return; foreach (Limb limb in Limbs) @@ -416,16 +419,19 @@ namespace Subsurface GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)-pos.Y, 5, 5), Color.White, true); } - if (refLimb.body.TargetPosition != Vector2.Zero) + foreach (Limb limb in Limbs) { - Vector2 pos = ConvertUnits.ToDisplayUnits(refLimb.body.TargetPosition); - pos.Y = -pos.Y; - GUI.DrawLine(spriteBatch, pos+new Vector2(-30.0f,0.0f), pos+new Vector2(30.0f,0.0f), Color.LightBlue); - GUI.DrawLine(spriteBatch, pos + new Vector2(0.0f,-30.0f), pos + new Vector2(0.0f,30.0f), Color.LightBlue); - + if (limb.body.TargetPosition != Vector2.Zero) + { + Vector2 pos = ConvertUnits.ToDisplayUnits(limb.body.TargetPosition); + pos.Y = -pos.Y; + GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X - 10, (int)pos.Y - 10, 20, 20), Color.Cyan, false, 0.01f); + GUI.DrawLine(spriteBatch, pos, new Vector2(limb.Position.X, -limb.Position.Y), limb==RefLimb ? Color.Orange : Color.Cyan); + } } + } public virtual void Flip() @@ -635,7 +641,7 @@ namespace Subsurface float resetDistance = NetConfig.ResetRagdollDistance; //if the limb is closer than alloweddistance, just ignore the difference - float allowedDistance = NetConfig.AllowedRagdollDistance; + float allowedDistance = NetConfig.AllowedRagdollDistance * ((inWater) ? 2.0f : 1.0f); float dist = Vector2.Distance(refLimb.body.SimPosition, refLimb.body.TargetPosition); bool resetAll = (dist > resetDistance && character.LargeUpdateTimer == 1); @@ -645,6 +651,11 @@ namespace Subsurface if (newMovement == Vector2.Zero || newMovement.Length() < allowedDistance) { refLimb.body.TargetPosition = Vector2.Zero; + foreach (Limb limb in Limbs) + { + limb.body.TargetPosition = Vector2.Zero; + } + correctionMovement = Vector2.Zero; return; } @@ -656,14 +667,14 @@ namespace Subsurface { //if (limb.body.TargetPosition == Vector2.Zero) continue; - limb.body.SetTransform(limb.SimPosition + newMovement * 0.1f, limb.Rotation); + //limb.body.SetTransform(limb.SimPosition + newMovement * 0.1f, limb.Rotation); } - correctionMovement = Vector2.Normalize(newMovement) * Math.Min(0.1f + dist, 3.0f); + correctionMovement = Vector2.Normalize(newMovement) * MathHelper.Clamp(dist*5.0f, 0.1f, 5.0f); } else { - correctionMovement = Vector2.Normalize(newMovement) * Math.Min(0.1f + dist, 3.0f); + correctionMovement = Vector2.Normalize(newMovement) * MathHelper.Clamp(dist * 5.0f, 0.1f, 5.0f); if (Math.Abs(correctionMovement.Y) < 0.1f) correctionMovement.Y = 0.0f; } } diff --git a/Subsurface/Source/Events/MonsterEvent.cs b/Subsurface/Source/Events/MonsterEvent.cs index cc0aeadfd..feb097ed9 100644 --- a/Subsurface/Source/Events/MonsterEvent.cs +++ b/Subsurface/Source/Events/MonsterEvent.cs @@ -31,7 +31,7 @@ namespace Subsurface for (int i = 0; i < amount; i++) { - Vector2 position = (randomWayPoint == null) ? Vector2.Zero : randomWayPoint.SimPosition; + Vector2 position = (randomWayPoint == null) ? Vector2.Zero : FarseerPhysics.ConvertUnits.ToSimUnits(randomWayPoint.Position + Level.Loaded.Position); position.X += Rand.Range(-0.5f, 0.5f); position.Y += Rand.Range(-0.5f, 0.5f); monsters[i] = new AICharacter(characterFile, position); diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 369ac7475..9df743cb7 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -48,12 +48,15 @@ namespace Subsurface get { return pauseMenuOpen; } } - public static void LoadContent(GraphicsDevice graphics) + public static void LoadContent(GraphicsDevice graphics, bool loadSounds = true) { graphicsDevice = graphics; - sounds = new Sound[2]; - sounds[0] = Sound.Load("Content/Sounds/UI/UImsg.ogg", false); + if (loadSounds) + { + sounds = new Sound[2]; + sounds[0] = Sound.Load("Content/Sounds/UI/UImsg.ogg", false); + } // create 1x1 texture for line drawing t = new Texture2D(graphicsDevice, 1, 1); diff --git a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs index 32ad2fe35..c2a61cfef 100644 --- a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs +++ b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs @@ -543,11 +543,10 @@ namespace Subsurface messageBox.Buttons[0].OnClicked += Restart; messageBox.Buttons[0].OnClicked += messageBox.Close; - //messageBox.Buttons[1].UserData = MainMenuScreen.Tabs.Main; + messageBox.Buttons[1].OnClicked = GameMain.MainMenuScreen.SelectTab; messageBox.Buttons[1].OnClicked += messageBox.Close; - yield return CoroutineStatus.Success; } diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs index 25cecb794..4c40a4ce7 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -77,7 +77,11 @@ namespace Subsurface.Items.Components if (voltage < minVoltage) return; - if (GUI.DrawButton(spriteBatch, new Rectangle(x+20, y+20, 200, 30), "Activate Radar")) IsActive = !IsActive; + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 20, y + 20, 200, 30), "Activate Radar")) + { + IsActive = !IsActive; + item.NewComponentEvent(this, true); + } int radius = GuiFrame.Rect.Height / 2 - 10; DrawRadar(spriteBatch, new Rectangle((int)GuiFrame.Center.X - radius, (int)GuiFrame.Center.Y - radius, radius * 2, radius * 2)); @@ -217,5 +221,22 @@ namespace Subsurface.Items.Components spriteBatch.DrawString(GUI.SmallFont, (int)(dist / 80.0f) + " m", new Vector2(markerPos.X + 10, markerPos.Y + 15), Color.LightGreen); } + public override void FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetOutgoingMessage message) + { + message.Write(IsActive); + } + + public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetIncomingMessage message) + { + try + { + IsActive = message.ReadBoolean(); + } + catch + { + return; + } + } + } } diff --git a/Subsurface/Source/Items/Components/Machines/Steering.cs b/Subsurface/Source/Items/Components/Machines/Steering.cs index c73ad1387..80b870d68 100644 --- a/Subsurface/Source/Items/Components/Machines/Steering.cs +++ b/Subsurface/Source/Items/Components/Machines/Steering.cs @@ -163,7 +163,7 @@ namespace Subsurface.Items.Components if (autopilotRayCastTimer<=0.0f && steeringPath.NextNode != null) { - Vector2 diff = steeringPath.NextNode.Position - Submarine.Loaded.Position; + Vector2 diff = ConvertUnits.ToSimUnits(steeringPath.NextNode.Position - Submarine.Loaded.Position); bool nextVisible = true; for (int x = -1; x < 2; x += 2) diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 367a376a9..f8a2fc131 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -517,24 +517,36 @@ namespace Subsurface body.SetToTargetPosition(); + bool inWater = true; + if (CurrentHull != null) { float surfaceY = ConvertUnits.ToSimUnits(CurrentHull.Surface); - if (surfaceY > body.SimPosition.Y) return; - //the item has gone through the surface of the water -> apply an impulse which serves as surface tension - if ((body.SimPosition.Y - (body.LinearVelocity.Y / 60.0f)) < surfaceY) + if (body.SimPosition.Y < surfaceY ) { - Vector2 impulse = -body.LinearVelocity * (body.Mass / body.Density); - body.ApplyLinearImpulse(impulse); - int n = (int)((ConvertUnits.ToDisplayUnits(body.SimPosition.X) - CurrentHull.Rect.X) / Hull.WaveWidth); - CurrentHull.WaveVel[n] = impulse.Y * 10.0f; + inWater = true; + + //the item has gone through the surface of the water -> apply an impulse which serves as surface tension + //if (body.SimPosition.Y - (body.LinearVelocity.Y / 60.0f) < surfaceY) + //{ + // Vector2 impulse = -body.LinearVelocity * (body.Mass / body.Density); + // body.ApplyLinearImpulse(impulse); + // int n = (int)((ConvertUnits.ToDisplayUnits(body.SimPosition.X) - CurrentHull.Rect.X) / Hull.WaveWidth); + // CurrentHull.WaveVel[n] = impulse.Y * 10.0f; + //} + } + else + { + inWater = false; } } + if (!inWater) return; + //calculate (a rough approximation of) buoyancy float volume = body.Mass / body.Density; - Vector2 buoyancy = new Vector2(0, volume * 20.0f); + Vector2 buoyancy = new Vector2(0, volume * 10.0f); //apply buoyancy and drag @@ -808,7 +820,7 @@ namespace Subsurface public bool Pick(Character picker, bool forcePick=false) { - + System.Diagnostics.Debug.WriteLine("Item.Pick("+picker+", "+forcePick+")"); bool hasRequiredSkills = true; bool picked = false, selected = false; diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index e175708ca..e05b90325 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -447,6 +447,16 @@ int currentTargetIndex = 1; for (int i = 0; i < pathCells.Count; i++) { + //clean "loops" from the path + for (int n = 0; n < i; n++) + { + if (pathCells[n] != pathCells[i]) continue; + + pathCells.RemoveRange(n+1, i-n); + break; + } + if (i >= pathCells.Count) break; + newWaypoint = new WayPoint(new Rectangle((int)pathCells[i].Center.X, (int)pathCells[i].Center.Y, 10, 10)); newWaypoint.MoveWithLevel = true; if (prevWaypoint != null) @@ -460,11 +470,9 @@ int currentTargetIndex = 1; newWaypoint = new WayPoint(new Rectangle((int)pathCells[pathCells.Count - 1].Center.X, (int)(borders.Height + shaftHeight), 10, 10)); newWaypoint.MoveWithLevel = true; - if (prevWaypoint != null) - { - prevWaypoint.linkedTo.Add(newWaypoint); - newWaypoint.linkedTo.Add(prevWaypoint); - } + prevWaypoint.linkedTo.Add(newWaypoint); + newWaypoint.linkedTo.Add(prevWaypoint); + } Debug.WriteLine("genpath: " + sw2.ElapsedMilliseconds + " ms"); @@ -748,6 +756,13 @@ int currentTargetIndex = 1; private void ResetBodyVelocities() { + if (prevVelocity == Vector2.Zero) return; + if (!MathUtils.IsValid(prevVelocity)) + { + prevVelocity = Vector2.Zero; + return; + } + foreach (Character character in Character.CharacterList) { if (character.AnimController.CurrentHull != null) continue; diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 54ee2a618..6c4616040 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -380,7 +380,6 @@ namespace Subsurface message.Write(Speed.X); message.Write(Speed.Y); - } public override void ReadNetworkData(Networking.NetworkEventType type, NetIncomingMessage message) diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index dd3ecae38..63af4fe4d 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -61,7 +61,7 @@ namespace Subsurface.Networking NetPeerConfiguration config = new NetPeerConfiguration("subsurface"); #if DEBUG - config.SimulatedLoss = 0.2f; + config.SimulatedLoss = 0.1f; config.SimulatedMinimumLatency = 0.3f; #endif @@ -90,11 +90,14 @@ namespace Subsurface.Networking catch (ArgumentNullException e) { DebugConsole.ThrowError("Couldn't connect to "+hostIP+". Error message: "+e.Message); + Disconnect(); + + GameMain.NetLobbyScreen.Select(); return; } - // Create timespan of 30ms - updateInterval = new TimeSpan(0, 0, 0, 0, 200); + + updateInterval = new TimeSpan(0, 0, 0, 0, 100); // Set timer to tick every 50ms //update = new System.Timers.Timer(50); @@ -127,6 +130,9 @@ namespace Subsurface.Networking Disconnect(); GameMain.NetworkMember = null; GameMain.MainMenuScreen.Select(); + + GameMain.MainMenuScreen.SelectTab(MainMenuScreen.Tab.LoadGame); + return true; } @@ -160,11 +166,21 @@ namespace Subsurface.Networking if (packetType == (byte)PacketTypes.LoggedIn) { myID = inc.ReadInt32(); - if (inc.ReadBoolean() && Screen.Selected != GameMain.GameScreen) + bool gameStarted= inc.ReadBoolean(); + if (gameStarted && Screen.Selected != GameMain.GameScreen) { new GUIMessageBox("Please wait", "A round is already running. You will have to wait for a new round to start."); } + bool hasCharacter = inc.ReadBoolean(); + + if (gameStarted && !hasCharacter && myCharacter!=null) + { + GameMain.NetLobbyScreen.Select(); + + new GUIMessageBox("Connection timed out", "You were disconnected for too long and your character was deleted. Please wait for another round to start."); + } + GameMain.NetLobbyScreen.ClearPlayers(); //add the names of other connected clients to the lobby screen @@ -173,12 +189,12 @@ namespace Subsurface.Networking { Client otherClient = new Client(inc.ReadString(), inc.ReadInt32()); - GameMain.NetLobbyScreen.AddPlayer(otherClient); + GameMain.NetLobbyScreen.AddPlayer(otherClient.name); otherClients.Add(otherClient); } //add the name of own client to the lobby screen - GameMain.NetLobbyScreen.AddPlayer(new Client(name, myID)); + GameMain.NetLobbyScreen.AddPlayer(name); CanStart = true; } @@ -245,7 +261,7 @@ namespace Subsurface.Networking if (client.ConnectionStatus == NetConnectionStatus.Disconnected) { - GameMain.NetLobbyScreen.RemovePlayer(myID); + //GameMain.NetLobbyScreen.RemovePlayer(myID); if (reconnectBox==null) { reconnectBox = new GUIMessageBox("CONNECTION LOST", "You have been disconnected from the server. Reconnecting...", new string[0]); @@ -330,7 +346,7 @@ namespace Subsurface.Networking Client otherClient = new Client(inc.ReadString(), inc.ReadInt32()); - GameMain.NetLobbyScreen.AddPlayer(otherClient); + GameMain.NetLobbyScreen.AddPlayer(otherClient.name); otherClients.Add(otherClient); AddChatMessage(otherClient.name + " has joined the server", ChatMessageType.Server); @@ -340,13 +356,15 @@ namespace Subsurface.Networking int leavingID = inc.ReadInt32(); AddChatMessage(inc.ReadString(), ChatMessageType.Server); - GameMain.NetLobbyScreen.RemovePlayer(otherClients.Find(c => c.ID==leavingID)); + Client disconnectedClient = otherClients.Find(c => c.ID == leavingID); + if (disconnectedClient != null) GameMain.NetLobbyScreen.RemovePlayer(disconnectedClient.name); + break; case (byte)PacketTypes.KickedOut: string msg = inc.ReadString(); - new GUIMessageBox("KICKED", msg); + new GUIMessageBox("You have been kicked out from the server", msg); GameMain.MainMenuScreen.Select(); @@ -370,9 +388,7 @@ namespace Subsurface.Networking new GUIMessageBox("You are the Traitor!", "Your secret task is to assassinate " + targetName + "!"); break; - } - - + } } } @@ -388,6 +404,16 @@ namespace Subsurface.Networking string mapName = inc.ReadString(); string mapHash = inc.ReadString(); + string modeName = inc.ReadString(); + + GameModePreset gameMode = GameModePreset.list.Find(gm => gm.Name == modeName); + + if (gameMode == null) + { + DebugConsole.ThrowError("Game mode ''"+gameMode+"'' not found!"); + yield return CoroutineStatus.Success; + } + if (!GameMain.NetLobbyScreen.TrySelectMap(mapName, mapHash)) { yield return CoroutineStatus.Success; @@ -401,7 +427,7 @@ namespace Subsurface.Networking Rand.SetSyncedSeed(seed); //int gameModeIndex = inc.ReadInt32(); - GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedMap, "", GameMain.NetLobbyScreen.SelectedMode); + GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedMap, "", gameMode); yield return CoroutineStatus.Running; @@ -508,6 +534,7 @@ namespace Subsurface.Networking client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); client.Shutdown(""); + GameMain.NetworkMember = null; } public void SendCharacterData() diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index fa95c2e06..c23846ece 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -22,12 +22,12 @@ namespace Subsurface.Networking private NetServer server; private NetPeerConfiguration config; - private TimeSpan SparseUpdateInterval = new TimeSpan(0, 0, 0, 3); + private TimeSpan sparseUpdateInterval = new TimeSpan(0, 0, 0, 3); private DateTime sparseUpdateTimer; private TimeSpan refreshMasterInterval = new TimeSpan(0, 0, 40); private DateTime refreshMasterTimer; - + private bool masterServerResponded; private bool registeredToMaster; @@ -110,9 +110,8 @@ namespace Subsurface.Networking { RegisterToMasterServer(); } - - - updateInterval = new TimeSpan(0, 0, 0, 0, 30); + + updateInterval = new TimeSpan(0, 0, 0, 0, 60); DebugConsole.NewMessage("Server started", Color.Green); @@ -203,17 +202,15 @@ namespace Subsurface.Networking return; } } - + public override void Update(float deltaTime) { if (!started) return; base.Update(deltaTime); - + if (gameStarted) { - if (myCharacter!=null) new NetworkEvent(myCharacter.ID, true); - inGameHUD.Update((float)Physics.step); } @@ -221,6 +218,13 @@ namespace Subsurface.Networking { disconnectedClients[i].deleteDisconnectedTimer -= deltaTime; if (disconnectedClients[i].deleteDisconnectedTimer > 0.0f) continue; + + if (gameStarted && disconnectedClients[i].character!=null) + { + disconnectedClients[i].character.Remove(); + disconnectedClients[i].character = null; + } + disconnectedClients.RemoveAt(i); } @@ -240,6 +244,21 @@ namespace Subsurface.Networking // if 30ms has passed if (updateTimer < DateTime.Now) { + if (gameStarted) + { + if (myCharacter != null) new NetworkEvent(myCharacter.ID, true); + + foreach (Character c in Character.CharacterList) + { + if (c as AICharacter == null) continue; + + if (c.SimPosition == Vector2.Zero || c.SimPosition.Length() < 100.0f) + { + new NetworkEvent(c.ID, false); + } + } + } + if (server.ConnectionsCount > 0) { if (sparseUpdateTimer < DateTime.Now) SparseUpdate(); @@ -260,26 +279,9 @@ namespace Subsurface.Networking private void SparseUpdate() { - foreach (Character c in Character.CharacterList) - { - bool isClient = false; - foreach (Client client in connectedClients) - { - if (client.character != c) continue; - isClient = true; - break; - } - - if (!isClient && (c.SimPosition==Vector2.Zero || c.SimPosition.Length() < 300.0f)) - { - c.LargeUpdateTimer -= 2; - new NetworkEvent(c.ID, false); - } - } - if (gameStarted) new NetworkEvent(Submarine.Loaded.ID, false); - sparseUpdateTimer = DateTime.Now + SparseUpdateInterval; + sparseUpdateTimer = DateTime.Now + sparseUpdateInterval; } private void ReadMessage(NetIncomingMessage inc) @@ -313,7 +315,7 @@ namespace Subsurface.Networking { //AssignJobs(); - GameMain.NetLobbyScreen.AddPlayer(sender); + GameMain.NetLobbyScreen.AddPlayer(sender.name); // Notify the client that they have logged in outmsg = server.CreateMessage(); @@ -324,6 +326,8 @@ namespace Subsurface.Networking outmsg.Write(gameStarted); + outmsg.Write(gameStarted && sender.character!=null); + //notify the client about other clients already logged in outmsg.Write((characterInfo == null) ? connectedClients.Count - 1 : connectedClients.Count); foreach (Client c in connectedClients) @@ -365,7 +369,8 @@ namespace Subsurface.Networking disconnectedClients.Add(connectedClient); } - DisconnectClient(inc.SenderConnection); + DisconnectClient(inc.SenderConnection, + connectedClient != null ? connectedClient.name+" has disconnected" : ""); } break; @@ -392,9 +397,7 @@ namespace Subsurface.Networking if (recipients.Count == 0) break; server.SendMessage(outmsg, recipients, inc.DeliveryMethod, 0); - - System.Diagnostics.Debug.WriteLine("Sending networkevent (" + outmsg.LengthBytes+" bytes)"); - + break; case (byte)PacketTypes.Chatmessage: ChatMessageType messageType = (ChatMessageType)inc.ReadByte(); @@ -537,10 +540,9 @@ namespace Subsurface.Networking private void SendNetworkEvents() { if (NetworkEvent.events.Count == 0) return; - + foreach (NetworkEvent networkEvent in NetworkEvent.events) { - //System.Diagnostics.Debug.WriteLine("networkevent "+networkEvent.ID); List recipients = new List(); @@ -565,16 +567,13 @@ namespace Subsurface.Networking networkEvent.FillData(message); - System.Diagnostics.Debug.WriteLine("Sending networkevent " + Entity.FindEntityByID(networkEvent.ID).ToString() + " (" + message.LengthBytes + " bytes)"); - if (server.ConnectionsCount>0) { server.SendMessage(message, recipients, (networkEvent.IsImportant) ? NetDeliveryMethod.Unreliable : NetDeliveryMethod.ReliableUnordered, 0); - } - + } } - NetworkEvent.events.Clear(); + NetworkEvent.events.Clear(); } @@ -661,6 +660,8 @@ namespace Subsurface.Networking msg.Write(GameMain.NetLobbyScreen.SelectedMap.Name); msg.Write(GameMain.NetLobbyScreen.SelectedMap.MD5Hash.Hash); + msg.Write(GameMain.NetLobbyScreen.SelectedMode.Name); + msg.Write(GameMain.NetLobbyScreen.GameDuration.TotalMinutes); msg.Write((myCharacter == null) ? connectedClients.Count : connectedClients.Count + 1); @@ -677,8 +678,11 @@ namespace Subsurface.Networking } SendMessage(msg, NetDeliveryMethod.ReliableUnordered, null); + + CreateCrewFrame(crew); - yield return CoroutineStatus.Running; + //give some time for the clients to load the map + yield return new WaitForSeconds(2.0f); gameStarted = true; @@ -686,8 +690,6 @@ namespace Subsurface.Networking GameMain.GameScreen.Select(); - CreateCrewFrame(crew); - yield return CoroutineStatus.Success; } @@ -758,10 +760,10 @@ namespace Subsurface.Networking } - private void DisconnectClient(NetConnection senderConnection) + private void DisconnectClient(NetConnection senderConnection, string msg = "", string targetmsg = "") { Client client = connectedClients.Find(x => x.Connection == senderConnection); - if (client != null) DisconnectClient(client); + if (client != null) DisconnectClient(client, msg, targetmsg); } private void DisconnectClient(Client client, string msg = "", string targetmsg = "") @@ -770,8 +772,8 @@ namespace Subsurface.Networking if (gameStarted && client.character != null) client.character.ClearInputs(); - if (msg == "") msg = client.name + " has left the server"; - if (targetmsg == "") targetmsg = "You have left the server"; + if (string.IsNullOrWhiteSpace(msg)) msg = client.name + " has left the server"; + if (string.IsNullOrWhiteSpace(targetmsg)) targetmsg = "You have left the server"; NetOutgoingMessage outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.KickedOut); @@ -785,7 +787,7 @@ namespace Subsurface.Networking outmsg.Write(client.ID); outmsg.Write(msg); - GameMain.NetLobbyScreen.RemovePlayer(client); + GameMain.NetLobbyScreen.RemovePlayer(client.name); if (server.Connections.Count > 0) { @@ -1092,7 +1094,7 @@ namespace Subsurface.Networking public override void Disconnect() { - server.Shutdown(""); + server.Shutdown("The server has shut down"); } } diff --git a/Subsurface/Source/Networking/NetworkEvent.cs b/Subsurface/Source/Networking/NetworkEvent.cs index 047357f60..6cc1420f5 100644 --- a/Subsurface/Source/Networking/NetworkEvent.cs +++ b/Subsurface/Source/Networking/NetworkEvent.cs @@ -18,7 +18,7 @@ namespace Subsurface.Networking { public static List events = new List(); - private static bool[] isImportant = { false, true, false, true, true, true, true, false }; + private static bool[] isImportant = { false, true, false, true, true, true, true }; private int id; diff --git a/Subsurface/Source/Particles/Particle.cs b/Subsurface/Source/Particles/Particle.cs index 73da4aaf8..643fefdbf 100644 --- a/Subsurface/Source/Particles/Particle.cs +++ b/Subsurface/Source/Particles/Particle.cs @@ -113,36 +113,40 @@ namespace Subsurface.Particles private List FindAdjacentHulls(List adjacentHulls, Hull currentHull, bool isHorizontal) { - foreach (Gap gap in Gap.GapList) + foreach (Gap gap in Gap.GapList) + { + if (gap.isHorizontal != isHorizontal) continue; + if (gap.Open < 0.01f) continue; + if (gap.linkedTo.Count==0) { - if (gap.isHorizontal != isHorizontal) continue; - if (gap.Open < 0.01f) continue; - if (gap.linkedTo.Count==1) + continue; + } + else if (gap.linkedTo.Count==1) + { + if (!adjacentHulls.Contains(gap.linkedTo[0] as Hull)) { - if (!adjacentHulls.Contains(gap.linkedTo[0] as Hull)) - { - adjacentHulls.Add(gap.linkedTo[0] as Hull); - } - } - else if (gap.linkedTo[0] == currentHull && gap.linkedTo[1] != null) - { - if (!adjacentHulls.Contains(gap.linkedTo[1] as Hull)) - { - adjacentHulls.Add(gap.linkedTo[1] as Hull); - FindAdjacentHulls(adjacentHulls, gap.linkedTo[1] as Hull, isHorizontal); - } - } - else if (gap.linkedTo[1] == currentHull && gap.linkedTo[0] != null) - { - if (!adjacentHulls.Contains(gap.linkedTo[0] as Hull)) - { - adjacentHulls.Add(gap.linkedTo[0] as Hull); - FindAdjacentHulls(adjacentHulls, gap.linkedTo[0] as Hull, isHorizontal); - } + adjacentHulls.Add(gap.linkedTo[0] as Hull); } } + else if (gap.linkedTo[0] == currentHull && gap.linkedTo[1] != null) + { + if (!adjacentHulls.Contains(gap.linkedTo[1] as Hull)) + { + adjacentHulls.Add(gap.linkedTo[1] as Hull); + FindAdjacentHulls(adjacentHulls, gap.linkedTo[1] as Hull, isHorizontal); + } + } + else if (gap.linkedTo[1] == currentHull && gap.linkedTo[0] != null) + { + if (!adjacentHulls.Contains(gap.linkedTo[0] as Hull)) + { + adjacentHulls.Add(gap.linkedTo[0] as Hull); + FindAdjacentHulls(adjacentHulls, gap.linkedTo[0] as Hull, isHorizontal); + } + } + } - return adjacentHulls; + return adjacentHulls; } public bool Update(float deltaTime) diff --git a/Subsurface/Source/Program.cs b/Subsurface/Source/Program.cs index c0c6c7dec..0b6a9b028 100644 --- a/Subsurface/Source/Program.cs +++ b/Subsurface/Source/Program.cs @@ -28,19 +28,19 @@ namespace Subsurface { using (var game = new GameMain()) { -#if !DEBUG +//#if !DEBUG try { -#endif +//#endif game.Run(); -#if !DEBUG +//#if !DEBUG } catch (Exception e) { CrashDump(game, "crashreport.txt", e); } -#endif +//#endif } } diff --git a/Subsurface/Source/Screens/MainMenuScreen.cs b/Subsurface/Source/Screens/MainMenuScreen.cs index 6529e55db..a9f02b5a2 100644 --- a/Subsurface/Source/Screens/MainMenuScreen.cs +++ b/Subsurface/Source/Screens/MainMenuScreen.cs @@ -10,7 +10,7 @@ namespace Subsurface { class MainMenuScreen : Screen { - public enum Tabs { NewGame = 1, LoadGame = 2, HostServer = 3 } + public enum Tab { NewGame = 1, LoadGame = 2, HostServer = 3 } GUIFrame buttonsTab; @@ -30,7 +30,7 @@ namespace Subsurface public MainMenuScreen(GameMain game) { - menuTabs = new GUIFrame[Enum.GetValues(typeof(Tabs)).Length+1]; + menuTabs = new GUIFrame[Enum.GetValues(typeof(Tab)).Length+1]; @@ -45,11 +45,11 @@ namespace Subsurface button.OnClicked = TutorialButtonClicked; button = new GUIButton(new Rectangle(0, 70, 0, 30), "New Game", Alignment.CenterX, GUI.Style, buttonsTab); - button.UserData = (int)Tabs.NewGame; + button.UserData = Tab.NewGame; button.OnClicked = SelectTab; button = new GUIButton(new Rectangle(0, 130, 0, 30), "Load Game", Alignment.CenterX, GUI.Style, buttonsTab); - button.UserData = (int)Tabs.LoadGame; + button.UserData = Tab.LoadGame; button.OnClicked = SelectTab; button = new GUIButton(new Rectangle(0, 200, 0, 30), "Join Server", Alignment.CenterX, GUI.Style, buttonsTab); @@ -57,7 +57,7 @@ namespace Subsurface button.OnClicked = JoinServerClicked; button = new GUIButton(new Rectangle(0, 260, 0, 30), "Host Server", Alignment.CenterX, GUI.Style, buttonsTab); - button.UserData = (int)Tabs.HostServer; + button.UserData = Tab.HostServer; button.OnClicked = SelectTab; button = new GUIButton(new Rectangle(0, 330, 0, 30), "Quit", Alignment.CenterX, GUI.Style, buttonsTab); @@ -65,13 +65,13 @@ namespace Subsurface //---------------------------------------------------------------------- - menuTabs[(int)Tabs.NewGame] = new GUIFrame(panelRect, GUI.Style); + menuTabs[(int)Tab.NewGame] = new GUIFrame(panelRect, GUI.Style); //menuTabs[(int)Tabs.NewGame].Padding = GUI.style.smallPadding; //new GUITextBlock(new Rectangle(0, -20, 0, 30), "New Game", null, null, Alignment.CenterX, GUI.style, menuTabs[(int)Tabs.NewGame]); - new GUITextBlock(new Rectangle(0, 0, 0, 30), "Selected submarine:", null, null, Alignment.Left, GUI.Style, menuTabs[(int)Tabs.NewGame]); - mapList = new GUIListBox(new Rectangle(0, 30, 200, panelRect.Height-100), GUI.Style, menuTabs[(int)Tabs.NewGame]); + new GUITextBlock(new Rectangle(0, 0, 0, 30), "Selected submarine:", null, null, Alignment.Left, GUI.Style, menuTabs[(int)Tab.NewGame]); + mapList = new GUIListBox(new Rectangle(0, 30, 200, panelRect.Height-100), GUI.Style, menuTabs[(int)Tab.NewGame]); foreach (Submarine sub in Submarine.SavedSubmarines) { @@ -86,68 +86,68 @@ namespace Subsurface if (Submarine.SavedSubmarines.Count > 0) mapList.Select(Submarine.SavedSubmarines[0]); new GUITextBlock(new Rectangle((int)(mapList.Rect.Width + 20), 0, 100, 20), - "Save name: ", GUI.Style, Alignment.Left, Alignment.Left, menuTabs[(int)Tabs.NewGame]); + "Save name: ", GUI.Style, Alignment.Left, Alignment.Left, menuTabs[(int)Tab.NewGame]); saveNameBox = new GUITextBox(new Rectangle((int)(mapList.Rect.Width + 20), 30, 180, 20), - Alignment.TopLeft, GUI.Style, menuTabs[(int)Tabs.NewGame]); + Alignment.TopLeft, GUI.Style, menuTabs[(int)Tab.NewGame]); saveNameBox.Text = SaveUtil.CreateSavePath(); new GUITextBlock(new Rectangle((int)(mapList.Rect.Width + 20), 60, 100, 20), - "Map Seed: ", GUI.Style, Alignment.Left, Alignment.Left, menuTabs[(int)Tabs.NewGame]); + "Map Seed: ", GUI.Style, Alignment.Left, Alignment.Left, menuTabs[(int)Tab.NewGame]); seedBox = new GUITextBox(new Rectangle((int)(mapList.Rect.Width + 20), 90, 180, 20), - Alignment.TopLeft, GUI.Style, menuTabs[(int)Tabs.NewGame]); + Alignment.TopLeft, GUI.Style, menuTabs[(int)Tab.NewGame]); seedBox.Text = ToolBox.RandomSeed(8); - button = new GUIButton(new Rectangle(0, 0, 100, 30), "Start", Alignment.BottomRight, GUI.Style, menuTabs[(int)Tabs.NewGame]); + button = new GUIButton(new Rectangle(0, 0, 100, 30), "Start", Alignment.BottomRight, GUI.Style, menuTabs[(int)Tab.NewGame]); button.OnClicked = StartGame; //---------------------------------------------------------------------- - menuTabs[(int)Tabs.LoadGame] = new GUIFrame(panelRect, GUI.Style); + menuTabs[(int)Tab.LoadGame] = new GUIFrame(panelRect, GUI.Style); //menuTabs[(int)Tabs.LoadGame].Padding = GUI.style.smallPadding; - menuTabs[(int)Tabs.HostServer] = new GUIFrame(panelRect, GUI.Style); + menuTabs[(int)Tab.HostServer] = new GUIFrame(panelRect, GUI.Style); //menuTabs[(int)Tabs.JoinServer].Padding = GUI.style.smallPadding; //new GUITextBlock(new Rectangle(0, -25, 0, 30), "Host Server", GUI.style, Alignment.CenterX, Alignment.CenterX, menuTabs[(int)Tabs.HostServer], false, GUI.LargeFont); - new GUITextBlock(new Rectangle(0, 0, 0, 30), "Server Name:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tabs.HostServer]); - serverNameBox = new GUITextBox(new Rectangle(160, 0, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tabs.HostServer]); + new GUITextBlock(new Rectangle(0, 0, 0, 30), "Server Name:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); + serverNameBox = new GUITextBox(new Rectangle(160, 0, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tab.HostServer]); - new GUITextBlock(new Rectangle(0, 50, 0, 30), "Server port:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tabs.HostServer]); - portBox = new GUITextBox(new Rectangle(160, 50, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tabs.HostServer]); + new GUITextBlock(new Rectangle(0, 50, 0, 30), "Server port:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); + portBox = new GUITextBox(new Rectangle(160, 50, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tab.HostServer]); portBox.Text = NetConfig.DefaultPort.ToString(); portBox.ToolTip = "Server port"; - new GUITextBlock(new Rectangle(0, 100, 100, 30), "Max players:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tabs.HostServer]); - maxPlayersBox = new GUITextBox(new Rectangle(195, 100, 30, 30), null, null, Alignment.TopLeft, Alignment.Center, GUI.Style, menuTabs[(int)Tabs.HostServer]); + new GUITextBlock(new Rectangle(0, 100, 100, 30), "Max players:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); + maxPlayersBox = new GUITextBox(new Rectangle(195, 100, 30, 30), null, null, Alignment.TopLeft, Alignment.Center, GUI.Style, menuTabs[(int)Tab.HostServer]); maxPlayersBox.Text = "8"; maxPlayersBox.Enabled = false; - var plusPlayersBox = new GUIButton(new Rectangle(230, 100, 30, 30), "+", GUI.Style, menuTabs[(int)Tabs.HostServer]); + var plusPlayersBox = new GUIButton(new Rectangle(230, 100, 30, 30), "+", GUI.Style, menuTabs[(int)Tab.HostServer]); plusPlayersBox.UserData = 1; plusPlayersBox.OnClicked = ChangeMaxPlayers; - var minusPlayersBox = new GUIButton(new Rectangle(160, 100, 30, 30), "-", GUI.Style, menuTabs[(int)Tabs.HostServer]); + var minusPlayersBox = new GUIButton(new Rectangle(160, 100, 30, 30), "-", GUI.Style, menuTabs[(int)Tab.HostServer]); minusPlayersBox.UserData = -1; minusPlayersBox.OnClicked = ChangeMaxPlayers; - new GUITextBlock(new Rectangle(0, 150, 0, 30), "Password (optional):", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tabs.HostServer]); - passwordBox = new GUITextBox(new Rectangle(160, 150, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tabs.HostServer]); + new GUITextBlock(new Rectangle(0, 150, 0, 30), "Password (optional):", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); + passwordBox = new GUITextBox(new Rectangle(160, 150, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tab.HostServer]); - isPublicBox = new GUITickBox(new Rectangle(10, 200, 20, 20), "Public server", Alignment.TopLeft, menuTabs[(int)Tabs.HostServer]); + isPublicBox = new GUITickBox(new Rectangle(10, 200, 20, 20), "Public server", Alignment.TopLeft, menuTabs[(int)Tab.HostServer]); isPublicBox.ToolTip = "Public servers are shown in the list of available servers in the ''Join Server'' -tab"; - useUpnpBox = new GUITickBox(new Rectangle(10, 250, 20, 20), "Attempt UPnP port forwarding", Alignment.TopLeft, menuTabs[(int)Tabs.HostServer]); + useUpnpBox = new GUITickBox(new Rectangle(10, 250, 20, 20), "Attempt UPnP port forwarding", Alignment.TopLeft, menuTabs[(int)Tab.HostServer]); useUpnpBox.ToolTip = "UPnP can be used for forwarding ports on your router to allow players join the server." + " However, UPnP isn't supported by all routers, so you may need to setup port forwards manually" +" if players are unable to join the server (see the readme for instructions)."; - GUIButton hostButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Start", Alignment.BottomRight, GUI.Style, menuTabs[(int)Tabs.HostServer]); + GUIButton hostButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Start", Alignment.BottomRight, GUI.Style, menuTabs[(int)Tab.HostServer]); hostButton.OnClicked = HostServerClicked; this.game = game; @@ -165,7 +165,14 @@ namespace Subsurface public bool SelectTab(GUIButton button, object obj) { - selectedTab = (int)obj; + try + { + SelectTab((Tab)obj); + } + catch + { + selectedTab = 0; + } if (button != null) button.Selected = true; @@ -177,12 +184,16 @@ namespace Subsurface otherButton.Selected = false; } - if (selectedTab == (int)Tabs.LoadGame) UpdateLoadScreen(); - - if (Selected != this) this.Select(); return true; } + public void SelectTab(Tab tab) + { + selectedTab = (int)tab; + + if (selectedTab == (int)Tab.LoadGame) UpdateLoadScreen(); + } + private bool TutorialButtonClicked(GUIButton button, object obj) { TutorialMode.Start(); @@ -242,11 +253,11 @@ namespace Subsurface private void UpdateLoadScreen() { - menuTabs[(int)Tabs.LoadGame].ClearChildren(); + menuTabs[(int)Tab.LoadGame].ClearChildren(); string[] saveFiles = SaveUtil.GetSaveFiles(); - saveList = new GUIListBox(new Rectangle(0, 0, 200, menuTabs[(int)Tabs.LoadGame].Rect.Height - 80), Color.White, GUI.Style, menuTabs[(int)Tabs.LoadGame]); + saveList = new GUIListBox(new Rectangle(0, 0, 200, menuTabs[(int)Tab.LoadGame].Rect.Height - 80), Color.White, GUI.Style, menuTabs[(int)Tab.LoadGame]); saveList.OnSelected = SelectSaveFile; foreach (string saveFile in saveFiles) @@ -262,7 +273,7 @@ namespace Subsurface textBlock.UserData = saveFile; } - var button = new GUIButton(new Rectangle(0, 0, 100, 30), "Start", Alignment.Right | Alignment.Bottom, GUI.Style, menuTabs[(int)Tabs.LoadGame]); + var button = new GUIButton(new Rectangle(0, 0, 100, 30), "Start", Alignment.Right | Alignment.Bottom, GUI.Style, menuTabs[(int)Tab.LoadGame]); button.OnClicked = LoadGame; } @@ -295,7 +306,7 @@ namespace Subsurface string mapseed = ToolBox.GetAttributeString(modeElement, "mapseed", "unknown"); - GUIFrame saveFileFrame = new GUIFrame(new Rectangle((int)(saveList.Rect.Width + 20), 0, 200, 230), Color.Black*0.4f, GUI.Style, menuTabs[(int)Tabs.LoadGame]); + GUIFrame saveFileFrame = new GUIFrame(new Rectangle((int)(saveList.Rect.Width + 20), 0, 200, 230), Color.Black*0.4f, GUI.Style, menuTabs[(int)Tab.LoadGame]); saveFileFrame.UserData = "savefileframe"; saveFileFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f); @@ -333,14 +344,14 @@ namespace Subsurface private void RemoveSaveFrame() { GUIComponent prevFrame = null; - foreach (GUIComponent child in menuTabs[(int)Tabs.LoadGame].children) + foreach (GUIComponent child in menuTabs[(int)Tab.LoadGame].children) { if (child.UserData as string != "savefileframe") continue; prevFrame = child; break; } - menuTabs[(int)Tabs.LoadGame].RemoveChild(prevFrame); + menuTabs[(int)Tab.LoadGame].RemoveChild(prevFrame); } public override void Update(double deltaTime) diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index dbec38b8d..625464bf3 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -102,7 +102,7 @@ namespace Subsurface public string DurationText() { - return "Duration: " + GameDuration.Minutes + " min"; + return "Duration: " + GameDuration.TotalMinutes + " min"; } public NetLobbyScreen() @@ -423,33 +423,29 @@ namespace Subsurface return true; } - public void AddPlayer(Client client) + public void AddPlayer(string name) { GUITextBlock textBlock = new GUITextBlock( - new Rectangle(0, 0, 0, 25), - client.name + ((client.assignedJob==null) ? "" : " (" + client.assignedJob.Name + ")"), + new Rectangle(0, 0, 0, 25), name, GUI.Style, Alignment.Left, Alignment.Left, playerList); + textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f); - textBlock.UserData = client; + textBlock.UserData = name; } - public void RemovePlayer(int clientID) + public void RemovePlayer(string name) { - GUIComponent child = playerList.children.Find(c => - { - Client client = c.UserData as Client; - return (client.ID == clientID); - }); + GUIComponent child = playerList.children.Find(c => c.UserData as string == name); if (child != null) playerList.RemoveChild(child); } - public void RemovePlayer(Client client) - { - if (client == null) return; - playerList.RemoveChild(playerList.GetChild(client)); - } + //public void RemovePlayer(Client client) + //{ + // if (client == null) return; + // playerList.RemoveChild(playerList.GetChild(client)); + //} public void ClearPlayers() { @@ -709,13 +705,12 @@ namespace Subsurface msg.Write(durationBar.BarScroll); msg.Write(LevelSeed); - //msg.Write(playerList.CountChildren - 1); - //for (int i = 1; i < playerList.CountChildren; i++) - //{ - // Client client = playerList.children[i].UserData as Client; - // msg.Write(client.ID); - // msg.Write(client.assignedJob==null ? "" : client.assignedJob.Name); - //} + msg.Write((byte)(playerList.CountChildren - 1)); + for (int i = 0; i < playerList.CountChildren; i++) + { + string clientName = playerList.children[i].UserData as string; + msg.Write(clientName==null ? "" : clientName); + } } @@ -742,6 +737,14 @@ namespace Subsurface durationScroll = msg.ReadFloat(); levelSeed = msg.ReadString(); + + int playerCount = msg.ReadByte(); + + playerList.ClearChildren(); + for (int i = 0; i0 && SoundManager.IsPlaying(alSourceId)) { - ALHelper.Check(); SoundManager.Stop(alSourceId); ALHelper.Check(); } diff --git a/Subsurface/Source/Sounds/SoundManager.cs b/Subsurface/Source/Sounds/SoundManager.cs index 62c89c6ae..8fcd7c96e 100644 --- a/Subsurface/Source/Sounds/SoundManager.cs +++ b/Subsurface/Source/Sounds/SoundManager.cs @@ -37,7 +37,7 @@ namespace Subsurface.Sounds { alSources.Add(OpenTK.Audio.OpenAL.AL.GenSource()); } - + ALHelper.Check(); if (ALHelper.Efx.IsInitialized) { lowpassFilterId = ALHelper.Efx.GenFilter(); @@ -162,6 +162,7 @@ namespace Subsurface.Sounds { return Loop(sound,sourceIndex, Vector2.Zero, volume); } + public static int Loop(Sound sound, int sourceIndex, Vector2 position, float volume = 1.0f) { if (!MathUtils.IsValid(volume)) @@ -177,8 +178,6 @@ namespace Subsurface.Sounds // AL.Source(alSources[sourceIndex], ALSourceb.Looping, true); // AL.Source(alSources[sourceIndex], ALSourcef.Gain, volume); //} - ALHelper.Check(); - return sourceIndex; } else { @@ -189,9 +188,11 @@ namespace Subsurface.Sounds //OpenTK.Audio.OpenAL.AL.Source(alSources[sourceIndex], OpenTK.Audio.OpenAL.ALSource3f.Position, position.X, position.Y, 0.0f); AL.Source(alSources[sourceIndex], ALSourceb.Looping, true); //AL.Source(alSources[sourceIndex], ALSourcef.Gain, volume); - ALHelper.Check(); - return sourceIndex; + } + + ALHelper.Check(); + return sourceIndex; } //public static int Loop(int sourceIndex, float volume = 1.0f) @@ -320,12 +321,13 @@ namespace Subsurface.Sounds if (oggStreamer == null) oggStreamer = new OggStreamer(); - oggStream = new OggStream(file); - - oggStreamer.AddStream(oggStream); + oggStream = new OggStream(file); + oggStreamer.AddStream(oggStream); oggStream.Play(volume); + ALHelper.Check(); + return oggStream; } @@ -337,15 +339,12 @@ namespace Subsurface.Sounds public static void ClearAlSource(int bufferId) { for (int i = 1; i < DefaultSourceCount; i++) - { - if (alBuffers[i] == bufferId) - { - OpenTK.Audio.OpenAL.AL.Source(alSources[i], OpenTK.Audio.OpenAL.ALSourcei.Buffer, 0); - } - } - - - + { + if (alBuffers[i] != bufferId) continue; + + OpenTK.Audio.OpenAL.AL.Source(alSources[i], OpenTK.Audio.OpenAL.ALSourceb.Looping, false); + OpenTK.Audio.OpenAL.AL.Source(alSources[i], OpenTK.Audio.OpenAL.ALSourcei.Buffer, 0); + } } public static void Dispose() diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 3097c7716b78474648ab5ac7207920f765a5bc7e..b8a3af50ca77db704c7746c5cc36624c5ac21d2c 100644 GIT binary patch delta 16784 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

NgtA$gvFHdgI+YgscvZ@TpxCBU- za0#$d2)J(nhW!k%5O@|?1pFCT3_J%c0ZIXMb^GT)dKvHn4d^R0FIv;6cx@wo9r#xo zr8hM2n;PY9Zs50oZUwdh<-m5J0;mLb06T#yfCIaL*MQx?>jJJ7_kei=coTRFa07dR zeZbqme&DabJHWfZ0pK8T2zU=T47?8<0geL40b{ZsfPM)4ts#99^dsOD@GVS)Yv4G!!UIwlJ z-vj>wt^(Hq&x$nj{EHXM$hcu-0$w7&F<26OHzY2VY_5fpKg}O01v*z~!Ia%amU!NC z(h$0+5q|)(tH5QmJecjN${4|U7JdTfw zkk>HRbVR83vfwI|B-*=22;*Uq@)ziPvJ_04ACv67#~f)tBmZ3{8!ZpVQ!qdqm4Cv5 zDI^5Rx-eO<-zx8llKYxn-liU|x!7x@Y>~4>N;)h}r(^r%cv_qbD~eqrA7QRy1X2HJ zIfc&WVM2SR$oW*aRPM{8mdYPks5sZGl6x0IfN!?xk`EP^Dj}5qS6St@9rBy^Q0?Dj zD+`7_%Qt-}WwYeZGqy+3^W!0r9`i6bkXkj~K3ZY|XOg7%bU)hhPPM4EBE9MR+{|Ty%iXTw8-r17J#*Zp?DHADA!!^sITxB|=+A^&>y`Cxt@bp5ZLZmzH*&uoJf|bY9?KH18)n) zY&5MhIm)J}6kRRH^TZvdeTwe;n@5RNmVzQ=~#>wPtpCA zNIq(!YWM_`PI)=1>REB_yTo(}i?vhJX~|{WMp|7aOg3Yc7RzJHO-Eql3(Qc!Diaj2 zZjb`@q`{U2%QhO;9?tEUkJgtgKDb!fQDaKO*5Nxj#QCGFI^0j%d7n$B-7?L$D*=vn zPg%Gb z&DQ4gT?5pN#lnY$1R$n!)RN^m!In7f6)8SM#Sq|5Q^c=L!xE`ERQGT?&*+cuPCN zCAS(26UbBdQ}Gf_;fE|5EPVct&>_p4n#8mAs)&H|Psx3FAAb!R<9SAC()Fo=iBFCk==UDspz_+U**`Bin0 zgRs%;M|;cV7F0VE(%3jm8`^@3U)55mcAOHxhs@GyEtDxJag>*$+Nu1!7D($qR

x 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