From 40fb8d803de03d34e97c1bd5db9794c3ae856335 Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Sun, 6 Dec 2015 16:07:25 +0200 Subject: [PATCH] Lighting fixes & teleporting characters to sub --- .vs/Subsurface_Solution/v14/.suo | Bin 706560 -> 726016 bytes Subsurface/Source/Characters/Character.cs | 2 +- Subsurface/Source/Items/Components/Door.cs | 19 +++++++--- .../Items/Components/Signal/LightComponent.cs | 2 +- Subsurface/Source/Map/Entity.cs | 2 +- Subsurface/Source/Map/Explosion.cs | 2 +- Subsurface/Source/Map/FireSource.cs | 2 +- Subsurface/Source/Map/Lights/ConvexHull.cs | 34 +++++++++++++----- Subsurface/Source/Map/Lights/LightSource.cs | 11 +++++- Subsurface/Source/Map/Structure.cs | 2 +- Subsurface/Source/Map/SubmarineBody.cs | 17 +++++---- 11 files changed, 66 insertions(+), 27 deletions(-) diff --git a/.vs/Subsurface_Solution/v14/.suo b/.vs/Subsurface_Solution/v14/.suo index da95ab367de4ec2c8cc19e873697dd363e90ec95..bde16e095fefa2c2076bc7ac52b7f90036bcbcbf 100644 GIT binary patch delta 14013 zcmeHudt8*&`tPiF)_WT+4hV=uI3g(;A{mmR(uj8@B=0FIC@2~NBIY$6FPRw?GB%H? z8JSJ)wkfH(EZuA*D|g#U-DQ{Kc9UtRQ|%(Nn>+P<*9Cz=hwE}+xvY5rP6|M%TNHZ0P14aO& zfYHDOMoUjvZ+fxfURJ3T20McT!YaBPW!;da_OyF}vVc|Y`cCPi!0ckLLVa_9&cFdAlLh9CYI~(X*BM`dkE6fJa{`_m}m&Gp&uvnG@(tj-; z0{v0oVW1p%1h|~00{%6PVK>~hm*YgAvFwkmGPsOoy5|IEx?fdp+jTBDkY&mi8W3H zAk)5zxVG?*ViudFCp?RhA&@>^##@>pjcEqU;7v=0HU@QMi3VB$!GJ90uEsd&mrawO zbR{yH#7TMk>+s5uXQnFc+uw1@w4S>G!b_cK8gcG}|Dk|CIzp^fu% z7u?K7e-_-k8~r2Tjs!*lqk%ENSl}LD955cp1||R#fk{9PkPA!(rT}?BJ}?!S1{46( z11#Z|8SvZ-6aq7Wxqy3bK-|oE@XQBR01JUdfaI{naF+nC#_;dKr57b<3g#KkW8GW! zMej-rtGkX(6WA_CWPRJp&~wTI0lU5rwJ}o8=*hd1dmWyhDTh`vuylWofn|JC2L2Ay zBpEmtxQ2mcUvI>~t&#NqGX}QZn1L&;vAbfoo-`{LIoysgPFv0^4r3P9sa#NWpsy0{ zt`Baht^%Vx;r^+pBW>=;VwF-W4f})j7I%_js*fS6#upW&&b_5Ji^^j7Fe$a@96Tl)jk=})SL&j&HoUyD0?qpQTo64>Ml)v-Z>f6ktjDDF&3bM1ZZBkErEG}90n(%1JS{65$*@P z2V?;5?4HR8%?fW z%pn$RQC6BByAmhj!gw2IvfEJX?LZUm3HP&?c`rErNz`T$7j`JtII3$&O5bf(GEH_1D(KL(5-NK} z8RqW$&#nQc#j+jUlphwXh&`{IZ0pJ7W!gGWJT1h6OumwNW2_~W#j&(`j?&(JC@g`> zezv}2TJlk3LGxlSSj%bU5~YP`QDF@+gu}_VGCs3u8nq14#Vvk%!m3BHGCHu^I@w*F z5*qkz*x!Rbi~Aufv36Sxu>wAq(iUk6o;o9%oR4v*s{Z`>3*|KH53DVDALCK>>n6tD zn}$gtrC)P#Cm{BO`jz!xR&uT8al7K|Cz!8e z?yTONoJ*NOn_f^1ghE8}IqPA)?J}4bSPYkz!(9P90IUQa1Xck)-TG&?rozDreY`={ z^RNhJUbMQc|Ib9ET)xdkWZ+d13Gu+W0-+LkS*XbVxgDulzeTLbJWlY^ZxSmq)31q@ z@M0{{`%&shxVn@za4Y<5^A58{QDqK4XiuH~iy1SmWN^e7h`YuQzV=UU*&xUIF$2`++|JHNc;NTHpXs2fPX#1YQGP z2i^b<0e=DB1pW#f2HsNKU7t(kC*XCLJeLzFhhBa^NWzKd;`RjdSWU!g+{?IBQCGxa zz-KUypGIHt(WMuZr+td;vckIbpDQeH1XsLKT=8`05CF0KB$I1Bb~u~pTR{h7jTvZ9 zanm-bgRzLK{l-Kr^T`A?1EiAmS-3eJnc`=C`Sb3NICPQ@pH|^S~Fc( zE~j-4{rsX4NssQfzM$Q->ccjLqp42>gECmCrxLwn?HFKv{LX*0P8z;;UfJ`s^hu=^ zom#5IxLuLZGwt~awkMhQV|4HtC5g(q@sYfJ)20QEf}%O(A7Tr!@w^@RIHOA^e$@Q! zTBq~1vMCANc?QLg1D*xsy#JmPn8FQ@!e6qNom~;RvFfeTf}@X5v>lle;ZtqmLxp!> z|ADAw>*&D4Y?5%K^LpKL&e~#4MG!^D@p!&g4q~r39=E09oYfH7STN&GF!%rP@-u}8^_Pi%H{6KB@ zC=p^&BwxYU3R)V#Cy;Z15ieGj@&(NErFFY~L(q_eUEX@X#hUC}hOao1nk#C)w5Buf zeOzf%WXZKmv*cS!8||CwfnN=NeEfwJ#rmhmdwlPtkEdGOP@02Rv^am}%#L=iDIb5_ zB4z8CyJxuDy2Hg;2M_i)PqMu}00vd5C7)*f-Dqk5amTXx#VOxJA6{zNu*mw&9sceG zx8ea*SZ52nP6dmKI$H^&HEUF-aJqOcTe1v;irKof9PSF>0bnKY0~Um&pJ{ZZ{{#3R zMV$1%2!A95qt+NN;HDug<2*=1Ku3h7vRV)S2H+ynFwi!^{}hm-TH07P!y_|oX>^~3 z`&^@ctCcn_<53}!pQ=H75!earr5EFPEB0sU+!R*}$^oDbcojGZyav1u$ei*c$8!EN zWlhl%Ta>Nb8}ajlpWSvr^Ze=LCwuAWG!`z3ig+dSt^j*3=8D^OG0yExjuL4lypDMm zU?VVy<}AQQ;92@^BVVGui%xVsLkphdiy0R`JF+r+VsYjFXWm0R-3Nw03@y~)*)m+8--kr{R9+Y?+>R5|Jw z*DP&y13C1NdILEmwm!|rYHKRC(3UKoq>hC_b~}BT#UJc*54_`m@jx~(0hkC(0&;*U zfUHe^dGO~0Q-Ntf0Wh7OZpquE&4RZSm<^NxbAbDRxxhSNKCl2-2rL5b2NnZM0GH}s z+y*=ANQ}&OUT5{6t+>Ar%~Y7>$}Zhq)^eM0>;?~bw{ninL0@`xKfjAA(s*8T^{M)H z1@zO4e4#cR)Axx^3wHAJT2Bn&iV#|`3sU7-@!iXO1mj_#U702-+sDg2&r364oi&yj z;}F@o={!=|6V~!Q4)s;++vF*3>!!KY37{D6`J-+Xadl9+o}Ji6>_Cb|k^cIt;BTy7 zm25Vee)uY4yVO{U`B00d zgaPU)@ndK0q-v(!W3dcQAJMlvJ^hf@mRz+QcFj7gT1Ivi z+f%gTjEZ__$(|)zSV$>0)+LrXmO^Z+{TuN~W01Z&A4v~&*LEwcTl3Nb`Xa|n%Vd;Y zMzeZqW9V>iE!0;*&|8)w?9z+zS8AC}xhsrYsQxJD^ufJIQNKW&NUnb&c(}ViLxiWs zjHT*3G%h~qrJYph$G-ju|KUKumBRrXrX08x7Tw!Dvo3-3;?}kEJ#rA>W2~YATv~Y>Hb*VQaoq)yg2V?COe+D7t)oS+ft_EdDb?8<@4!1Rp4*R(+$h-n;2`{rtG zq+0As8FJPd25Uw$3xiO91ZBmO~Xg^jQC-V*o=%_o-SZ25EDUxeqEy0Y35K zUq_TXO}icZfYY_fqfxSNaxj^}F#ABO7@%>gou)Y{t3*qnl0TaXzldD1r}c? z^w-=FfvdEFK(}iYLM@Pz(V}py+Q7uSq#a^( z?0qdvR6n8Bn_^>6H7`&&$Emv+)jp{eP|mwrvdGF%SA|g0PvC%xXS5Pd)ol$MIiuB1 zQpZ@QV6hZ$({2*0qSaH(yG4}}no~}i8YULUsLL27?bmvd{X?yjNZPI)vrOBUHa_T$YT@==7hpgVuQCR64+G0w)9ishFp&8=D z>)JS-4xZtisNp>xD$>5<2d%Vo0tVGNOnsj02e8gheyk1P{rir{^1QDOrTf27mwV5` zhHQYSK2-pI*xpf%7K!KhF_k6{#1NI_tD1=UUOT1J*+?}{ zmiL=A7fw14d}4GH-P-GaWt3iI#?z+3+T`C=oe|X8&wJwamvr*10dr4oP@{Z%UK&)W zB{tJ=X^dW6r?#i5>(seQIisw{)Nxe*kQxC=Gu@JHDW*FYY2nI>CNUvWTu=AOvCB6E zAFWfP*$?zi7rh&$jnNYR1Fb2wRys~7!53?qn(VFbmj?l6fKwt zZQ)$6I?1&`b+OshM_LX(4Or_nBSg(uspbDKDrAjZ>(z+R(RdY+WVsDT2=Z5c#NJaP z*=p+3kKgaJ3+#OFke8i90{?!0Nc$J9L$G?%eyW2WN zUVF6I7Jqxp{#*O+dwIwIn2_|im6k41!s+QbHdwD|%xPv@nw~ZMdrKf2!}9y-dxE}S z%~Bx8n2$C zw7+UzxkCygM?3rk9@ah*_NO(MA~pYMWzTkXh$2qBsP4h5gqe_qImfimnW)^Q7Adso zCD{Hcd)0b6mT4x^&V5=YmBtz|Vv|#ytpC@H1_7g?*7}R~z?We@eNE1MbpY+1rmljr zwzZYVD8KeRe6Ij`NKU!#}VLF!Yc;zCQ&Ynkt4x|sp}?~dpKKEd5VORQ$A zWf!eEt}Y6iJ!kUF+|ubq`IC$D=F`Xf)mzy%UyPPtR5rcLPik4i`lTk}Z(&kW_r6I3 zy5HWp|5c-aQSN@VG`MK`%-pi+#YNerxzqBBDeDWhGYx%T4Q9Vs6SrFWU0+#%+22=l z;*{B`bl{BIIry&JlI&|}wyQK+I#eGJal21Q$)B*=bo>Sa{c32!3r3H57BzYT7 zSHDmbTV7w@IAV`jGvqcZSd5RcC<|)>u}JtIMue3(obnSu@j1UG&!Mm{h&lxP^fF zo~lo8+~u5nLd_1hbe|elcd;%eW6P6y+bQPj9vPM+uSg|1nr3~V#?aV_df?@U5f&<( zsCU=LzJuc<9H$K2puVhl%QxKTe|GVl(kc1=H7g{i&!gwF^$=@baWU2JR}Zlo%L1wTuo>l9t8-c%r5&d} z)ATvl4o{1q0T{0lzVX6pOY@19P`MUvK=+B8t91VYkN2|-e#2^$@w*6+vTL6@>$#kp za9;88YV3~Xz?u5svizA>g_jJ?&TdAtU8VU;H=A&(e3BC;OTXa+1PAuNJRzu}x343< zMSVRv$R{E%r}kHL2MYFoVYLI`DFgcb*Vv?GNQUH{zL$9i)sOa7Pw^A}TaX36oDx1xh&!*0lI!GR+#Ghg!&xSs4Afh%NxMHiY>B!^v&LcbfW9#ijE zTwIDO`d{s(aXrZj61j%z10$9;DOp~{Eby0n{mN(&)YrFA2F>xQpT_c+Ow|K|e<{Lt zHNxMGo10YD5&m|vvb}`LR?!`!^xN#gzL~hf@&o*xKqYqDjfk3`=r8=vCWXt3nhvt? zrt5c1jy|2Lr|PY!_LLexPv+=>lsH-M8}i;2Js4K|G5jN_=5uwKPYMV~fdJMf{Yu$5 zz=ppKAa!-4P^P7ynC+WRO%OHWJ>|ui-zB9 zI6Tkmi3E`lE%H|Dr*EO*pPGox(4v@!W{tGX6}8oR*9h7?!f*&zN3EWTv#;wACC3Ki zY|-9c%es8j-Ca~4(krc`L_qA<{9sM+{6W`f|E(If10U+RL%4*XeXJfKoI^AR6X}Qb z8q@m$h%++vND*1DcTz;oP_2qn$!$g`-5ffrtR4Er58zISN$hh>^$u=l^k#ArJ{71_9&80V>m?K zs%5d~(oew@NY6J*sVdnPLk)k>!pP;;$I)Yb6uT(esa0CNdvP#W^{_dFCV81njO2PC z@|{M$(o~#rm%OXDr@g8^h?1rmC8ETxS72K;jYX1uixDi^hv^^T!PARoAlYloFyV;S z>lxYaw2c%a<8&Awwc)lDYH(_)qNJb9y6BV+`8-HJf~d9nXsXsVJ5B0s#btJ;jvaYU zG&b|jeUQ}|&$Ii)*3tS{l`78Y*&@3@-(phrKlMNnSf-CuX=efEXVG|+xAs%LFo0_9 zdODRZXPCwLx=W*)o|-1KUZmTN8s_O_q*Km6^eU=dX3Kdl z=d2zi(xVYUKc2?vU|2un%K+Nh-JC&3TH&lStK5hZmE(*eG`!yIMM*(sC^`Du98@&J zSmtNBBTMuoU$ywZg0WUl2eY5#!U%Hq*KCy8&a_d(9ca_!dyPTClwN3dCHn?k_boot28P!jgO^q=^D0V$dAV+}#?PeO0 z;`|b$8atSF8rDJ=?3hL=&-kMvB)YcoQ=tVFXXQd_U?@3OFOGa6b@>|Y?^>>1`V^41tTf1%6D zcq=vZ#(hRfCtDI_eQX$%6l)k_&!3GUfu6}`mdJV=+~9c^?N9$u?<$-{X01u}iE6OO zdDln*2R9psir35(viHMe*T08SUFTup*FOesbPdC_E%?B|OVbmWwy%b&SUX=D4Umbc z#&9Yu0gDzk7;CLmI8?Q7-XRc75V zuAFGv^pmNHv6be^*4`ppB%R%)XH!EeR7L#m(tbBeAH}Z zy&SKWA?oV2Qc`2A%+{Bz%nZwGR%T@PR@chN$I7VWIkO9j*Iw>@p8Lo1lKQ3qjZs z1&D5lbwJ*xgPwDxkt$(EP>pVV$~RFbNpGZfe(GKzEFc5-d?$1xfxjT1D5Outny1~} z={+KL)-uUGhki+ZahHnYg*S=&keF!v6ba@aaSy~n%yYKJk5>O0+W=Cf7$cuXqF;~~ zZ`i&U&flFtvqfGxY0n%wh>-E_gJRDhUUR*RJy(Nci90WJt$SZcH1wgeVe-NNo$dhy z7sw(^7bBbq6HY)u*l}!}Ya-@5A!6}825|);Bcida3nBsW9lqBf44ChT;O)M|p$-<@ z`9bEzDi#GIwj;^ch&04le3y~rG0f{Qe-Ea&VOk>UbY?6n#yn>egy~U)8DYb^9+)0O z`~~SXOw$p`NROn~o=hxzAM1I+aH3nRyAul*VZmLP^1{Q|U|}l(f4{r6oagy70N=S> z+8)~4fzq0G#5AZi&j-n$w$%UD(lQ8ng!%Ypw6vUWB_4qVV-T?j3Cm_8#$mn}qK&~$ z%uhy4K}EY@Y66=oL5V0pc{7{$bTEV1^!tS3&Iqla$RIN}T z>=&T2R@h-H!SX^JLIc%EIpWpA?6`Oq_JW3i|)z(o0yg z3@P41T*8`(h~8MX7t_;-FA+~5DiB<%;N2`F2sr{=+$@;)(6pbYRU7DD$`=au8EACT z3)q+w{(uesjyQvO8Oxr-G#pb2Q-(N%`BcOa#H)zzh}RIWBd%gS!SqeUaYU*J$$_+= zzn6+YT4MMfOL;H8e$NKd=qkN+k9GSwHNXAV;S~S8b#BL&eCwoO+J5VB+W)}T;cVJ( z9sd5WY#qLH18_)u>-|ex=O{Md%=z<2TSvpi<#hkit@A)D(|>8})b1Vdhr4Hw<>$uX z;EbZt5FJH};q}2%Uw4uaP<>G^!=SJA&qKptsTbdDyu|(Hp5C59LRGE;OVMUN1ih%- znZ;5045=SYtQKaq({ltqc~`y#9vAc`*7E^!((QJ3vqG(1A4_}d+wEU)tQUs34-386 z<@JJrkYdO*lQgIqAX?biP~q^S%u+(*2pxH2qf$Bq4iD2OQxvh6{kTDprE0HWao3Ed z5Pd~>N+n$Gu{Sije8t}rIDQm{K>zNvSHNqkPPY@~i4UACR7OG5XR?(o*di=bt4ETW zKt9KdxZrOf!Bu#6BOcOU~l_-T@;ML7Sw@@zh2XWSgSR`Y|Zo;m9 zA_zit0ZAc7=v_btC3ePg1JayBnuCb%5iN*^5Pw4CA;R?hv_&y1- z9rJG>%?2Fk-vuGmvz7{;X2A;1U4oTa7m$w$BT@R6nY;r2Hia0O(WN&k%yNiE6J-=C zSPx`z%^iW`FkR(Yua6+BV2MiSK;0K|IINDQ&q}owsbkWLxOzuc7byJzVrch(rsixq z^F?!)HO~x#B~J<+;rtRIinIXPuFqh$dcC)IwS(?7S~_p5d5jj6%~&f|eyT0Kn;me_ zEaJJSr(`|v=YFVJuS6SHoVmSXd5<*r;qAFwOE3I=3X~QT6Z1}|Hd38SgWdMKDA<+| z1vWk_DEJn_QZDO{%l^H;WsVR{Bim1gIV^M)Av54$GZ_eV^Mq)2-&MU^U!6{$H-7HT zIIf>GzqIEIwuplXbcesM_tR-N;-OTievL-6XcOH+Xt(yeQ2YV|pH1-NP;%$Lst|Fw zKEI(5kz678y8g35@G?jmMpAB4iNN+M5dfbIBVmEpwE$JuKU>R3vVjfP=+ne!xU7vr zEKO-Y5pXmLb|n#uhO{qcmmATH)dx|l#H>4oE=1M!!us3W(|}_aw?w91>b+>bo-?!WG(<)23u2eTgSEj2(6E#scTetR> zGY3xh?9#J&=$6idHg4Vn&-E89V4Fu*2T%M-9X{zEdS928{c{Ir1 zC9_7Nt@nlckHXMg+7TjiX&l&dX(ah&&62LdW<4y+rIqA@?-;ShH3_y4qVvFVhENtA zOV1K`Cq^`Zsfw0}ZWP2Um|sN~q7D46inbVjz~v2k1@|dFK*rFn;9HlT@${rxA4ju^ z!WTNB{RF|$ofguV_C@M&6!Ytx2m7Tr)hpFjdYP<&?~KA?@?S6~L|7~?$4Uj}?-IH* z>pH!M(CO_N1US&o@zLSKS~4k7j0ZP}D?(;P4ES>Wt*-6=7~BzhIJBwoxKrx|{qEOp z1?^QW4Nf{VGn{-(?gmZ$g&-I*N83|1!s?FR8p+c0=pj-asdq?!My3mb*n&v?G6KsM z3&u6BwXkI;O%l2HiHG-h(nr_0ELtf>C=(FV2rN0Pzh#YUOqB^uR0)m!74K+Qif{s> zZ(ET7xN>h3eFRh~^oTL^{glrJo~>XptAm?g8ql;DK8ce$z(SQi;+cR3AfJZk zJ&JwtS#WT(yArVq@fcz?;&Frv(MH45wfO!gL^T2s>kz!0P0FVS2-opgI->o=xW=pG zruq6e05)v7X#=!3n(T?`bQ1Yrucv1Q`UUS^eKOcas^P}f6PjY*d#bo&?5+Q}@73|+ zRoFC-bYL@=(lx}h9$iZ%q5v@$QG`NTK^>$I%vnJf3wH#-_bcdNZWp9?QSUt;!Gb3# zN|DQik84h6R7|F(Li*Pv?^Z1`ny6p_`2#Tuh48Y6zIe@49 z;pc&jRtx$#(zy`)JizPRm|u%%I}-rrw<5U5Uytbq#1n`o5gQRtA!_ux&bnI6a0Xji zQ@(cFTJ!M&Y;@9ykX`s*hjTIaV$?k!z#XSr}^)mPIqB$jtQ4~gd^79bWP9zZ;ZScF)NaOz>v zF7#~vZ9fG|t_fT8ZF~0PN-ER#5e%Q*??o{GA%{hIKd^5YiM%0<;g>bF2)>`%!kBDa zw6-wDO)=hDN1fq(_O-a@dD6i3IdX$jgwfouy6eyp^II-1gtz_G`(UFp8AEm!x z?RpY#tFwp>9gk|jk7hR;zv?(*b#DpB^{%6b^wqCZhx8Oqc6cx>I6#}FKV!eW|YDqU0kNzJQSS7EKB-ZhdQ8(vr5?hu@-Gx*J;M z9f)ZVA{b#rgdjo@VF(iDmgmKAII&!`vY$Vek~={X5h;sYEKV|j(}hMM`Y1*y%(+rL z69$PtN)l9Ep;qwXxau#8?+PRi4t9`C5cjPZuAqYGKG_u!0|UPm`w-&pg3-M9Ta0b+ zpY2-C1OERtBC5k?S4r?ZfeIZ?vBt|7^KdC-O`>VbMxZ%Q!IgX*j zhN2=oq$Ho>vcsOj+_q&Bj5bNJ#vmL92YY1>p zbNx#&w1X50F&(6tp5y35)^?D38E5F`=p4Ffc%mxTS#&w6K!W59G64<-(JZLT#Z&pG zL2?v<+M{wDbdQkE;DJWUAmzSu4K%p$U}HBc8Z>+^2eDnZNL2(XkI81}c#G71oAXvl z0NbsS4W`{H1;OghQgVHiY$K34T)G85>@3AVU7plOo#^Y{q4S+QY>Zf?SJ1$Bk!l6rlagV17s)`%AY`$=BNW9*@yr_|ISG`Ele)siaZ*swgo&tn#W&8iTaCMg|m@Qty;3t>2LGM}MYr|>=NuLlnG+4?2=U^$bdaM-dtAO75Qf7crXUf9J zxl%WC5#aG9!!tx8Fzbre9qPW84bZz#8U)UKoL$oZLcuszGW)r1FO)_SQUFUn5)#0* zQK8Uhr(y;7XsJi_Xe76nNyy>_QDNVXmV$+Cwz0^!ptGDxro+$-Igd-m2yYgn$Tp3W zI@gbvYyy;)Nf9t}9BLoVHk8k)4w~+gpM~ejq)y};c(Y9E4bB*;D|h%h7tWG%;*tTJ zr5S?DBq^){r{mB~)lJ3~FV{`tf`VY1Tr8Cp&z?D_5}Y=<2#86J_iN~q5IHG$;>>bK zS-GQlnxpK#k#B3D&y?>1@7;17o0=)F6Fdtf>dBJ@sC`I9GxrW24?No?0r#;~zgx-` zLXveU_?N6p(q-xT>U!yVz}PSKU9q^o?hf7ESTF!9QgvA{Bu(GzH>ksIqDJ~r9}3;z z#Dh}QztiZO`53cqe_l#qxqGF00?qrRI2N~08X$N+paLs@Q8E)ae@V2!&KA)K1AY=; z40t#c?I;RW*1ZC@5P2TBR>}bZrPGRMJIcx`rFjiKSI;P%8u>VGa zwn|P2Yf9wXNIQZ+S;a(r4wd=t3*y9M|tfXp0hL@ zdUccscbrx{bHenpiH>P=%Vs01wih2U94eC+f$dB2E_l`?2a(^K7nOC{zgKSx9o8y_ z!KLM;Q_3n6C(a%WCzr@QAR|&XbjT_G-FoeMJp`|o2b;U0r2UV{%Y8{8BHJgK2+w5< zB2Gri<9sW?g?y6?LxS6Sv!hsXD7n{%5_-L>n=6BEtb~nbd4M^#btLFRz5K&VUp|&U zTIX;x=iWAq>p~fNeI%W7ivN%X2h^U%FC2bf<9|%v#MYc&IDW1C6}1To&dllGsz<)X zxltm&U1`WEzFrBXtK@-ZbnmT?$;%^R{%t7xchxdDFvlkeRMRqCje*x?V9Y80tt#yK zdX;Y_++78eknK}(|3t%a@!M4TX8kq>W#$ZN(|+u>@OrmWPBE|XT%pw5x;cK6Hr!8p zGnrpI+GN2~uBH6smi+?QCdd!+z2)`%j9zx%m*TCk$t?H3jUR^nkIDNKX1XBoW37%0 zmD}tv`|_!MJzZXW>!%`qArpf)@FDD=1-&g9#WoF;#}i0Au7tx3kP}#TzPz76(qHl2 z_9t}Bwj#L%maY^dSj1KOnaFDJU4(|ORRbjDsv0v-l~)Mxjw)JVhbl%f8x_5JsCrFJ zXXmENhlocJ4Nx^lNn#B%DO| zA1Hl690G|}(W(|kY<&9ju#@Dj>t#?}BWmoFRXj&XI-HCZyRo_$aR-6i+r?1U&`tbI z07G{iQ$>-I3dd4KGn5RJqrg%mM}Vso!@ASAi8Xp3O?8f(3YH}Cb%;#C7WPbT-9waQ zxY7^r(~kENk5EXugr+4wK@4JzsbV&PydFsDO+&U7Off-pU(7W!>|pXp%=uWH7>^>` z`K>;R?d>C;CJ=f?jfElakZ^YHoNPt8xwUu}e@UK8*@}J`B0}|DICSKR_decFvAgwm zi9!B8Y!xUdK5B>?EXG4cx@aK@zFAiYZTg~^fK+Mo3SL_7#v5JW`rHg4k zp;*E7j$(vkHt_&En<;t-2xn+0+kHj8D6^&g#dMrgD$c2{s}fgTAZma_q2TO|b4VW` zmVm&N(C2q67YQUc<2Mm+g;YtPB3GONrafv&y!EhMm;iO%H8VR;6@GQ|kdnog;cOAoTP7=UkTe0OI=3gj+B+zD zQ1dZzGYl6~plK~JfHszzU{yMobG#Y}XNqu@8Vkh+0v}{y6I_NMu)LrqK;!$^u6___ zlZ!WRKCalwA(-$!ie|5*d?m7tBSfnAca5SChc}b;M&H6Cb5TJ>7Po-)YjqsEYEWv4 zcu!VdP7nBGtavxrmmp7E?mo~o6(fIV0FD_ICn(R3=I+Z;sfYvf`)23JR5{a2FpBQc?&+gej9y5O`zQ zXx5^@6^iT|K9sJ?u%$vShQ~7nBMS;s@bqwLw>Xz&?G;y$Z8c_$E3@7ci}|6($ohOH zeII)5Jd#-|l^xM3^{F^;u=AyXI`r3{2kN9FDe4+Zb3Flo9n*>@6P#?Fe1c%m`#4^0-s z-FXKL?1)7((o8MU&F8M%dvXMDtWY#f2Hz2 zJ-iuu9ST&XW3D?nmbg$W5M-SRY5c*7eugWin!`w`dG6R$wlgvht~Pp}z}$^A6F4$rN=Hn7Gh z_u+@vcv$Q<99Hp!?wL7<_xf}a8+6)y%Hn`J9{C?yF@k}?&%%~~`&m#s8v zP$_6xuz#)+&7`qPGhTMRASSV-6-tE>to`&^V7#Qnve?neI>PY7a)}B_vFKhCb|?<8 zexPJS;~h!_i=2)Q5^B$DC7!315NH~RO5M0qHnP+M%CSIb%2&~0bWkY^I-y)5P;;w_ z13QHS^PIume%7L{gF1((Y&&qTVt{u>U|f@CQ6tz_XBCqON%!K|8(vY2Ecq+t1c5_ft*XR0%@=Te%3&jKN=7c$3vs zR^F^s1we@#ue>TMFk*OHkB-0JJasaJzKnf0%~uXU?HH7cFUo7GLV7()QI6n(^MQ(!WQL}2#t|i3Rpq{!dc#aWiJ8yJ?dx}SEWRYq?i>PI>w6CS#`jq@dz{giqp7>16Pve>%Mc%&67;nLc6sTfS` zeuYnI3dZ20pHl}IAoLlfh&}U#f}wMYS&4+5tMMlS4KJ(c5-t)g6&lWK$<FvBr59%H?Q z>PRpiS3}`arINrRzEe&Sch$X<(b(ZGc;dKc0cD%@l!|vr9vmrZgNa22^O4%$Pzqq&Azb~{r`5H35cX@)VB4(}Ld{WB zrppWD6iE8B90_k96JpsHA*v+8gtu_9ydNt;K4BY|qOhGGsI>u5`-5Vu=9^YKri8QH zj_TDo*gIK?g1W1k11?tKk!f!yEsE7-s$7Vs=D)X1bb$QS|~tGH?0VgMyU!L=T+CL z+pM4AOwX5NL{;)BE?3I;>H*bVH8+_RexW`S2uTUrNVl^jk~s>sRh__gT1|l(i)La2 zcWe7Xz?gzN)cX~3AMm<{m)4hB)CDqr$(XfODT5P@)XFw0+Ev1=$FxZj)IO%9`0N%~ z)@n&?-AT<9154$AK9DdHLrzDQS_GC67&lA}&~_w%<8y5hlr(6uEU&M&Hv*ats^zSF znRdhkhkj7=;J{csLYjZjE*QYL5Y0ecKYY)Y0wSgA31Sj#ti#h`Twp-72+?=TCa(QS z;L5}J*`BQ#;Ycqfjepn=g8hHh?4EKh{GUy}>*nvXubAbS|Fh+rk<4syh*dL91 z_XfP#PA36zP+OxdW62w|N)-y%;@)aIKBiO~0w`W&i*H diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 6796d5346..7744f2b37 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -735,7 +735,7 @@ namespace Barotrauma { Limb head = AnimController.GetLimb(LimbType.Head); - Lights.LightManager.ViewPos = ConvertUnits.ToDisplayUnits(head.SimPosition); + Lights.LightManager.ViewPos = ConvertUnits.ToDisplayUnits(WorldPosition); if (!DisableControls) { diff --git a/Subsurface/Source/Items/Components/Door.cs b/Subsurface/Source/Items/Components/Door.cs index a5fb7cc62..1bacc26f9 100644 --- a/Subsurface/Source/Items/Components/Door.cs +++ b/Subsurface/Source/Items/Components/Door.cs @@ -144,8 +144,8 @@ namespace Barotrauma.Items.Components Vector2[] corners = GetConvexHullCorners(doorRect); - convexHull = new ConvexHull(corners, Color.Black); - if (window!=Rectangle.Empty) convexHull2 = new ConvexHull(corners, Color.Black); + convexHull = new ConvexHull(corners, Color.Black, item.CurrentHull == null ? null : item.CurrentHull.Submarine); + if (window!=Rectangle.Empty) convexHull2 = new ConvexHull(corners, Color.Black, item.CurrentHull == null ? null : item.CurrentHull.Submarine); UpdateConvexHulls(); @@ -303,7 +303,12 @@ namespace Barotrauma.Items.Components if (stuck>0.0f && weldedSprite!=null) { - weldedSprite.Draw(spriteBatch, new Vector2(item.Rect.X, -item.Rect.Y), Color.White*(stuck/100.0f), 0.0f, 1.0f); + Vector2 weldSpritePos = new Vector2(item.Rect.X, item.Rect.Y); + if (item.Submarine != null) weldSpritePos += item.Submarine.Position; + weldSpritePos.Y = -weldSpritePos.Y; + + weldedSprite.Draw(spriteBatch, + weldSpritePos, Color.White*(stuck/100.0f), 0.0f, 1.0f); } if (openState == 1.0f) @@ -311,8 +316,12 @@ namespace Barotrauma.Items.Components body.Enabled = false; return; } - - spriteBatch.Draw(doorSprite.Texture, new Vector2(item.Rect.Center.X, -item.Rect.Y), + + Vector2 pos = new Vector2(item.Rect.Center.X, -item.Rect.Y); + if (item.Submarine != null) pos += item.Submarine.Position; + pos.Y = -pos.Y; + + spriteBatch.Draw(doorSprite.Texture, pos, new Rectangle(doorSprite.SourceRect.X, (int)(doorSprite.size.Y * openState), (int)doorSprite.size.X, (int)(doorSprite.size.Y * (1.0f - openState))), color, 0.0f, doorSprite.Origin, 1.0f, SpriteEffects.None, doorSprite.Depth); diff --git a/Subsurface/Source/Items/Components/Signal/LightComponent.cs b/Subsurface/Source/Items/Components/Signal/LightComponent.cs index 8f84865f7..e100f3022 100644 --- a/Subsurface/Source/Items/Components/Signal/LightComponent.cs +++ b/Subsurface/Source/Items/Components/Signal/LightComponent.cs @@ -88,7 +88,7 @@ namespace Barotrauma.Items.Components // break; //} - light = new LightSource(item.Position, 100.0f, Color.White); + light = new LightSource(item.Position, 100.0f, Color.White, item.CurrentHull == null ? null : item.CurrentHull.Submarine); IsActive = true; diff --git a/Subsurface/Source/Map/Entity.cs b/Subsurface/Source/Map/Entity.cs index a1f3c6b12..51f3ce6dc 100644 --- a/Subsurface/Source/Map/Entity.cs +++ b/Subsurface/Source/Map/Entity.cs @@ -64,7 +64,7 @@ namespace Barotrauma public Submarine Submarine { get; - protected set; + set; } public AITarget AiTarget diff --git a/Subsurface/Source/Map/Explosion.cs b/Subsurface/Source/Map/Explosion.cs index 5c88f7e01..491cb18b3 100644 --- a/Subsurface/Source/Map/Explosion.cs +++ b/Subsurface/Source/Map/Explosion.cs @@ -68,7 +68,7 @@ namespace Barotrauma float displayRange = ConvertUnits.ToDisplayUnits(attack.Range); - light = new LightSource(displayPosition, displayRange, Color.LightYellow); + light = new LightSource(displayPosition, displayRange, Color.LightYellow, hull != null ? hull.Submarine : null); CoroutineManager.StartCoroutine(DimLight()); float cameraDist = Vector2.Distance(GameMain.GameScreen.Cam.Position, displayPosition)/2.0f; diff --git a/Subsurface/Source/Map/FireSource.cs b/Subsurface/Source/Map/FireSource.cs index 41dfc3d87..ae2fd58be 100644 --- a/Subsurface/Source/Map/FireSource.cs +++ b/Subsurface/Source/Map/FireSource.cs @@ -50,7 +50,7 @@ namespace Barotrauma fireSoundLarge = Sound.Load("Content/Sounds/firelarge.ogg"); } - lightSource = new LightSource(position, 50.0f, new Color(1.0f, 0.9f, 0.6f)); + lightSource = new LightSource(position, 50.0f, new Color(1.0f, 0.9f, 0.6f), hull == null ? null : hull.Submarine); hull.AddFireSource(this, !networkEvent); diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index b3f6a486f..20c72fdf3 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -30,6 +30,7 @@ namespace Barotrauma.Lights private Dictionary cachedShadows; + private Vector2[] worldVertices; private Vector2[] vertices; private int primitiveCount; @@ -38,6 +39,8 @@ namespace Barotrauma.Lights private VertexPositionColor[] shadowVertices; private VertexPositionTexture[] penumbraVertices; + private Entity parentEntity; + private Rectangle boundingBox; public bool Enabled @@ -51,7 +54,7 @@ namespace Barotrauma.Lights get { return boundingBox; } } - public ConvexHull(Vector2[] points, Color color) + public ConvexHull(Vector2[] points, Color color, Entity parent) { if (shadowEffect == null) { @@ -67,9 +70,12 @@ namespace Barotrauma.Lights penumbraEffect.Texture = TextureLoader.FromFile("Content/Lights/penumbra.png"); } + parentEntity = parent; + cachedShadows = new Dictionary(); vertices = points; + worldVertices = new Vector2[vertices.Length]; primitiveCount = vertices.Length; CalculateDimensions(); @@ -109,6 +115,7 @@ namespace Barotrauma.Lights for (int i = 0; i < vertices.Count(); i++) { vertices[i] += amount; + worldVertices[i] += amount; } CalculateDimensions(); @@ -118,17 +125,26 @@ namespace Barotrauma.Lights { cachedShadows.Clear(); + worldVertices = points; vertices = points; } private void CalculateShadowVertices(Vector2 lightSourcePos, bool los = true) { + for (int i = 0; i < vertices.Length; i++) + { + worldVertices[i] = vertices[i]; + if (parentEntity != null && parentEntity.Submarine != null) + { + worldVertices[i] += parentEntity.Submarine.Position; + } + } //compute facing of each edge, using N*L for (int i = 0; i < primitiveCount; i++) { - Vector2 firstVertex = new Vector2(vertices[i].X, vertices[i].Y); + Vector2 firstVertex = new Vector2(worldVertices[i].X, worldVertices[i].Y); int secondIndex = (i + 1) % primitiveCount; - Vector2 secondVertex = new Vector2(vertices[secondIndex].X, vertices[secondIndex].Y); + Vector2 secondVertex = new Vector2(worldVertices[secondIndex].X, worldVertices[secondIndex].Y); Vector2 middle = (firstVertex + secondVertex) / 2; Vector2 L = lightSourcePos - middle; @@ -171,7 +187,7 @@ namespace Barotrauma.Lights int svCount = 0; while (svCount != shadowVertexCount * 2) { - Vector3 vertexPos = new Vector3(vertices[currentIndex], 0.0f); + Vector3 vertexPos = new Vector3(worldVertices[currentIndex], 0.0f); //one vertex on the hull shadowVertices[svCount] = new VertexPositionColor(); @@ -201,7 +217,7 @@ namespace Barotrauma.Lights for (int n = 0; n < 4; n += 3) { - Vector3 penumbraStart = new Vector3((n == 0) ? vertices[startingIndex] : vertices[endingIndex], 0.0f); + Vector3 penumbraStart = new Vector3((n == 0) ? worldVertices[startingIndex] : worldVertices[endingIndex], 0.0f); penumbraVertices[n] = new VertexPositionTexture(); penumbraVertices[n].Position = penumbraStart; @@ -248,7 +264,7 @@ namespace Barotrauma.Lights if (cachedShadows.TryGetValue(light, out cachedShadow)) { if (light.Position == cachedShadow.LightPos || - Vector2.DistanceSquared(light.Position, cachedShadow.LightPos) < 1.0f) + Vector2.DistanceSquared(light.WorldPosition, cachedShadow.LightPos) < 1.0f) { shadowVertices = cachedShadow.ShadowVertices; penumbraVertices = cachedShadow.PenumbraVertices; @@ -256,8 +272,8 @@ namespace Barotrauma.Lights } else { - CalculateShadowVertices(light.Position, los); - cachedShadow.LightPos = light.Position; + CalculateShadowVertices(light.WorldPosition, los); + cachedShadow.LightPos = light.WorldPosition; cachedShadow.ShadowVertices = shadowVertices; cachedShadow.PenumbraVertices = penumbraVertices; @@ -266,7 +282,7 @@ namespace Barotrauma.Lights else { CalculateShadowVertices(light.Position, los); - cachedShadow = new CachedShadow(shadowVertices, penumbraVertices, light.Position); + cachedShadow = new CachedShadow(shadowVertices, penumbraVertices, light.WorldPosition); cachedShadows.Add(light, cachedShadow); } diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index 5bb4ced6d..70382be4e 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -19,6 +19,8 @@ namespace Barotrauma.Lights private Texture2D texture; + public Entity Submarine; + private Vector2 position; public Vector2 Position { @@ -32,6 +34,11 @@ namespace Barotrauma.Lights } } + public Vector2 WorldPosition + { + get { return (Submarine == null) ? position : position + Submarine.Position; } + } + public static Texture2D LightTexture { get @@ -64,10 +71,12 @@ namespace Barotrauma.Lights } } - public LightSource(Vector2 position, float range, Color color) + public LightSource(Vector2 position, float range, Color color, Submarine submarine) { hullsInRange = new List(); + this.Submarine = submarine; + this.position = position; this.range = range; this.color = color; diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index b76cb1149..313509faa 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -263,7 +263,7 @@ namespace Barotrauma corners[2] = new Vector2(rect.Right, rect.Y); corners[3] = new Vector2(rect.Right, rect.Y - rect.Height); - convexHull = new ConvexHull(corners, Color.Black); + convexHull = new ConvexHull(corners, Color.Black, this); } InsertToList(); diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index 3cb381dd9..0320806bf 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -9,7 +9,6 @@ using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Linq; -using System.Text; using Voronoi2; namespace Barotrauma @@ -32,7 +31,7 @@ namespace Barotrauma private float depthDamageTimer; - private Submarine sub; + private Submarine submarine; private Body body; @@ -88,7 +87,7 @@ namespace Barotrauma public SubmarineBody(Submarine sub) { - this.sub = sub; + this.submarine = sub; List convexHull = GenerateConvexHull(); @@ -119,7 +118,7 @@ namespace Barotrauma body.BodyType = BodyType.Dynamic; body.CollisionCategories = Physics.CollisionMisc; - body.CollidesWith = Physics.CollisionLevel; + body.CollidesWith = Physics.CollisionLevel | Physics.CollisionCharacter; body.Restitution = 0.0f; body.FixedRotation = true; body.Awake = true; @@ -387,8 +386,14 @@ namespace Barotrauma VoronoiCell cell = f2.Body.UserData as VoronoiCell; if (cell == null) { - lastContactCell = null; - lastContactPoint = null; + Limb limb = f2.Body.UserData as Limb; + if (limb!=null && limb.character.Submarine==null) + { + var ragdoll = limb.character.AnimController; + ragdoll.SetPosition(ragdoll.RefLimb.Position - body.Position); + limb.character.Submarine = submarine; + } + return true; }