From 8467b4fcae172f9bf63f7e8cf307fbbef342cbdf Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Mon, 4 Nov 2019 16:55:36 -0800 Subject: [PATCH] Fix NREs in ISRU code * check if renderer list is null on HeatEffects plugin before lateupdate * correctly use reversed deploy animation for retracting ISRUs when retract animation is not present --- .../GameData/ReStock/Plugins/Restock.dll | Bin 36352 -> 36864 bytes Source/Restock/ModuleRestockHeatEffects.cs | 4 +- Source/Restock/ModuleRestockISRUAnimation.cs | 89 ++++++++++++++---- 3 files changed, 72 insertions(+), 21 deletions(-) diff --git a/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll b/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll index 904a2e5797c1b951e2fb7ecb1430e5d6c3185732..57c0b58514d3699a678d8b6a6cea95b96dce7e5c 100644 GIT binary patch delta 5062 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 Mq;2&X(mh1~Ka&j} zNeWngM5PWQRJ*iN*B^ETjk1Ub1($_o*B|uYBK{yn&$7y*uB@xD>e)Nl73PEo1~hI|?LK*wWka%ym|!7vN`HupeL# zBh#ELNMu9Zc7U0zke0FQ$xw4@HR^+Sx3l#mMAow1WGLCdPLd+uY#h$7M!YE)VDwag ztXTkr^{lN*Pp9WeQV*b~R2c(crU@NFtQxzmhJoT5l&E4%?vgd_w>AzGkL|aXxmc%M ziGosaj-b$nd0-3&3df<4CX7k$1A~RkREkYNS*uz2N^qAk3>S*ka;XJTa>wfUD0gd? zYGcC3{iQgaRx1}I_)t$QEIjjmEP~x~CyoD$K(jI)YfE#**isyX2}v-$n4lfcD8YTY zhm+D36Zs&SChGASveSgj<{CUXV&(}xqu3-7KxXRt`Y)XGSOA0AX{m|zz!Mm z$7{KYM}lXp%s_Q!3L>gj#StW!( z`a`Rp(20bdwlxo@39P)nT;~coGy9_w1+gx)cXuiUyqq+FE27%4o!Pz!OUb=zkVGrM3PnQX=kt6#;2DkE`V&0gM3;AYg9S*Q|1QT3BtR0NQ! zRmwO&a>)c&P{i@jcubdBez!7|n{m&o({l8LFP>C=lMoHYE=`DZx-oI{*yv>eszd-$ z7<8Pa&p7s}j=k(7hbIZbSHAEiO4iL?eU5vMD&;&FE|3;~>@nW$pHv0c9^fK%Qo}hv zcgX}N73Rgm*e#dGUY~KAl*(i^P^g6}=m@7IR-qfyD8GGx>(C9_0{XSZcG0-gkeQQO ztk4*>Qf1Zwg$@-`B`6$^;!7tS+tf;iq_QPF7^vlBwuQ!5p*N#~FSc|NN&&)tOcF2L zcz`b@TqNmhoGW#OhtVwd0**4fE!D$NAsIWfsI1^(OIA64!oa?9FQ8`(>?Ti@EmwkO zhbi_vn#UJP>~YW6bg{%XdrPcss4*q>bHxFP9r1>3?{Zr?wvLNDM&|X6ql1j>I^X5C z>wKlQDkIujR9k%Y4)|u%ZAMm*mrHjT*_gZ*ddA3}&)b!!ld(bv&|}$c@gdlE=wrvZ z|2Z;SKIrDW`Tgo!;`d&zu4EH-s8_EG-_f;0u}Ts z6T1+o;*ZMwDtfz#-I-s|(2B!iFJeTqRBnl{L0WPasYP1x7(Ud@Eb%k_a$Vw|JiSTg zOxiwOe7>0-&G%==2FmU?v;XG%3%6!uH66H0y7%B7cTb6EEo< z1r^j|VOt6cN;@pjtOfI6EtS0(R!!|qs+>Wfx*_FRC2^ciUxAB$W?|nJoTe8n?1Nx{ zZp>mAgXP8=D>TQaT3JP5LGVWGI}8{^^Q9c&KH?8^u@wK?P&PATDy zYBk@Mro}f9`n`?aJh;kMmyJ&N5#TP3<38Fxc&xgQq|81_pB=n_(v{iirlFm>z)>`J zNQ$3e;f`TH{ysLb0LN3=%pCf#m|M_9D{g=MG5kMvrm}PN)9mzjWy?vPVh1R`wh3OC z27p~Cj$S(%j~F;OE&V{n&BSkppW{JfgIlw=7;VsMQG#*CYls9+ z(SAPY3M#?-2Hy5Md3z*>w-zgJPkK6a1m@aiNCYC*Sw;eH3dx|{n~dp0qbhXCark4* zzc|*&1iv}9;4dGNx7WpKzo0|l^)JMDYzWu2!JRmLBkT}#2$p%1)ChYudI-J9@Mn!8 zzIH0Z2|?{}TvsMr;449G@Iw{>D|9AtsWJhr@TMR&pcT#wQUlr`3xBc!4#6Y3*~A8R zMT`?pvq2Hm28-PU9B^3GiAgv>9;RB3!o_jG_kvU}4(KjTs!Bfl9C!~8lT0!>Fb|Is zB)L&P9Cax{ZE~l5jGO~&HG0-Q4yi+Jfl$&>Rga610KIk z9)rqUcv(|ULuD=;)M&3fQFg=Y8vRvnM0!t9JMcMqU??6JnaX&eOi(*?;*`8F7f&_5 zXnG%~O&XQ^59_?}0}{q>g8~Bq9}L0MmD6`#PO~)%qNxwQ(a43Cc@V_Yj9ZpsW%6L7 zpbpqzzgo@%7oG%}8s@`7L29}4p287`>=-aG2rmp67=*ca6!U<0 zduGXna90&4b(0psuLNy|r?PI7i(sWj64GGUsL=`MZE^|xMxz$TVp)Ob1tmLRm*E~c z1V;sSz(pw~m%~?r+C+gXU^RZr^6+D&HF5>rNQfk!$(pJ`j3iG*RRO5{P@L1F0Dbj5>ek)G0Yqg*e_VK}SN(xj^i zmFETWObtl(TH#a#j6kDCJYWQFt>d~jaNuWZ1X6<3@DW(6k_aDx2Q?iJAAv2Jj)#xH z2O2GPC7V$Bi9oeb5jZPo6?9=`BJg9s&Hxj^8V0=7TGWGGBc574ydDucQ(s;!(lM1p zGWGC*rsK)f!zY5oG9~4D_)?%6z8=06vnY z$U6#$G#$@73P&{^Pdf^ssp(zg_fs;G{j%=(wPAAHk_%z-nq@e&(KlS(WElC#yPeb! zx8t{D8TmM{9VKrG$*LSKnG^UOwx8H{qfN2nHSE9TID&mW+HWPt>~E18))n?RYseA* zIh5~nohLI$kNiEE!48M-^wp4m8@Qi7^t_IEvY(`3@~PqXG|Z+(qSi2xEq_Fb*Mj>y zy)AN>pu5}a-!_KHUz|$}VOBdSOv355NpFxwd^tdGoCx>91j}4t5H-&ek~Y!yi1vVJ z`$S6!w=Wd!L}J1Ie8R`3H%A{Xp{YmN7tQ(Ug|V$!_L)zvm*C|qr#?&f?O8qVKALtd zzk!f07HciZ?=hH3PTQ{yLC8rx;V>GrvK*;>;_qok>S>m4ZEAd44iZ%;19nip&jM6* zxQ!TkE(aun9^{-4G3jfJ5H3 zWg87>cLIl;kg?O1{u=FqUAZ}_KGdJ!BGh$hUEW*9t(K?G5z>=hw33n__y2@J;*qh% z9CT6ugE~@w64;gAu&Rg~?_B*Ht$f1w&K@9FO{chT7vsHYJKp#5U94UNA5OgacL(Xk zyPZ9>rpP|on@>m9&53l+Io+ac`_J|4;F`IWn(&=dnh<{9 diff --git a/Source/Restock/ModuleRestockHeatEffects.cs b/Source/Restock/ModuleRestockHeatEffects.cs index 6742d344..c07de0c2 100644 --- a/Source/Restock/ModuleRestockHeatEffects.cs +++ b/Source/Restock/ModuleRestockHeatEffects.cs @@ -121,6 +121,9 @@ namespace Restock public void LateUpdate() { if (!HighLogic.LoadedSceneIsFlight) return; + if (renderers == null) return; + //when switching to the flight scene LateUpdate gets called AFTER OnLoad for some reason + // so renderers should hopefully only be null for one frame if (enableHeatEmissive) { @@ -148,7 +151,6 @@ namespace Restock if (disableBlackbody) { _propertyBlock.SetColor(_shaderBlackbodyID, Color.black); - } for (var i = 0; i < renderers.Count; i++) diff --git a/Source/Restock/ModuleRestockISRUAnimation.cs b/Source/Restock/ModuleRestockISRUAnimation.cs index f8c1a79c..0e04818b 100644 --- a/Source/Restock/ModuleRestockISRUAnimation.cs +++ b/Source/Restock/ModuleRestockISRUAnimation.cs @@ -31,7 +31,7 @@ namespace Restock // should the module wait until a current looping animation completes before changing state? [KSPField] public bool waitForComplete = false; - public bool IsDeployed => (CurrentState == State.InactiveWaiting || + public bool IsDeployed => (CurrentState == State.InactiveWaiting || CurrentState == State.Active || CurrentState == State.Deploying); @@ -68,14 +68,49 @@ namespace Restock _activeAnimationPresent = (activeAnimationName != string.Empty); _inactiveAnimationPresent = (inactiveAnimationName != string.Empty); - DeployAnimation = ((_deployAnimationPresent) ? - base.part.FindModelAnimators(deployAnimationName)[0] : null); - RetractAnimation = ((_retractAnimationPresent) ? - base.part.FindModelAnimators(retractAnimationName)[0] : null); - ActiveAnimation = ((_activeAnimationPresent) ? - base.part.FindModelAnimators(activeAnimationName)[0] : null); - InactiveAnimation = ((_inactiveAnimationPresent)? - base.part.FindModelAnimators(inactiveAnimationName)[0] : null); + if (_deployAnimationPresent) + { + DeployAnimation = base.part.FindModelAnimators(deployAnimationName)[0]; + if (DeployAnimation == null) + { + _deployAnimationPresent = false; + this.LogError($"Can't find deploy animation named {deployAnimationName}"); + } + } + else DeployAnimation = null; + + if (_retractAnimationPresent) + { + RetractAnimation = base.part.FindModelAnimators(retractAnimationName)[0]; + if (RetractAnimation == null) + { + _retractAnimationPresent = false; + this.LogError($"Can't find retract animation named {retractAnimationName}"); + } + } + else RetractAnimation = null; + + if (_activeAnimationPresent) + { + ActiveAnimation = base.part.FindModelAnimators(activeAnimationName)[0]; + if (ActiveAnimation == null) + { + _activeAnimationPresent = false; + this.LogError($"Can't find active animation named {activeAnimationName}"); + } + } + else ActiveAnimation = null; + + if (_inactiveAnimationPresent) + { + InactiveAnimation = base.part.FindModelAnimators(inactiveAnimationName)[0]; + if (InactiveAnimation == null) + { + _inactiveAnimationPresent = false; + this.LogError($"Can't find inactive animation named {inactiveAnimationName}"); + } + } + else InactiveAnimation = null; foreach (var a in base.part.FindModelAnimators()) a.Stop(); @@ -116,7 +151,7 @@ namespace Restock DeployStart(); } } - + break; // System is inactive, but waiting for the animation to end before deploying @@ -176,7 +211,8 @@ namespace Restock case State.ActiveWaiting: if (!waitForComplete || !_activeAnimationPresent) { - this.LogError("Invalid state! waitForComplete not enabled or active animation not present."); + this.LogError( + "Invalid state! waitForComplete not enabled or active animation not present."); CurrentState = State.Active; } else if (ConvertersEnabled()) @@ -201,9 +237,19 @@ namespace Restock { DeployStart(); } - else if (!RetractAnimation.IsPlaying(retractAnimationName)) + else if (_retractAnimationPresent) { - RetractEnd(); + if (!RetractAnimation.IsPlaying(retractAnimationName)) + { + RetractEnd(); + } + } + else if (_deployAnimationPresent) + { + if (!DeployAnimation.IsPlaying(deployAnimationName)) + { + RetractEnd(); + } } break; @@ -220,7 +266,8 @@ namespace Restock private void DeployWait() { - if (_inactiveAnimationPresent){ + if (_inactiveAnimationPresent) + { CurrentState = State.InactiveWaiting; PlayAnimation(InactiveAnimation, inactiveAnimationName, loop: false); } @@ -237,7 +284,8 @@ namespace Restock if (_retractAnimationPresent && RetractAnimation.IsPlaying(retractAnimationName)) { RetractAnimation.Stop(retractAnimationName); - } + } + CurrentState = State.Deploying; PlayAnimation(DeployAnimation, deployAnimationName, speed * deploySpeed); } @@ -250,7 +298,7 @@ namespace Restock private void DeployEnd() { CurrentState = State.Active; - + if (_activeAnimationPresent) { PlayAnimation(ActiveAnimation, activeAnimationName, loop: true); @@ -269,7 +317,7 @@ namespace Restock RetractStart(); } } - + private void RetractStart(float speed = 1f) { if (_retractAnimationPresent) @@ -277,7 +325,8 @@ namespace Restock if (_deployAnimationPresent && DeployAnimation.IsPlaying(deployAnimationName)) { DeployAnimation.Stop(deployAnimationName); - } + } + CurrentState = State.Retracting; PlayAnimation(RetractAnimation, retractAnimationName, speed * retractSpeed); } @@ -295,7 +344,7 @@ namespace Restock private void RetractEnd() { CurrentState = State.Inactive; - + if (_inactiveAnimationPresent) { PlayAnimation(InactiveAnimation, inactiveAnimationName, loop: true); @@ -345,7 +394,7 @@ namespace Restock animState.wrapMode = loop ? WrapMode.Loop : WrapMode.Once; //if (!anim.IsPlaying(name)) - anim.Play(name); + anim.Play(name); } } } \ No newline at end of file