From e0c44dde50bd295b2e7e7b16593e801b1e28441c Mon Sep 17 00:00:00 2001 From: Crzyrndm Date: Thu, 23 Jul 2015 21:17:32 +1200 Subject: [PATCH] version 2.4.1 Patch for dissapearing subcategories Fix for override not being copied --- FilterExtension/ConfigNodes/Check.cs | 2 +- .../ConfigNodes/customSubCategory.cs | 4 +- FilterExtension/Editor.cs | 57 +++++++++--------- .../000_FilterExtensions/FilterExtensions.dll | Bin 59392 -> 58880 bytes .../FilterExtensions.version | 2 +- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/FilterExtension/ConfigNodes/Check.cs b/FilterExtension/ConfigNodes/Check.cs index 0dabd039..12d909f7 100644 --- a/FilterExtension/ConfigNodes/Check.cs +++ b/FilterExtension/ConfigNodes/Check.cs @@ -169,7 +169,7 @@ public bool checkPart(AvailablePart part, int depth = 0) result = PartType.checkCrewCapacity(part, value, equality); break; case CheckType.custom: // for when things get tricky - result = PartType.checkCustom(part, value); + result = Editor.instance.ready ? PartType.checkCustom(part, value) : !invert; break; case CheckType.mass: result = PartType.checkMass(part, value, equality); diff --git a/FilterExtension/ConfigNodes/customSubCategory.cs b/FilterExtension/ConfigNodes/customSubCategory.cs index 6792820c..2d9c4da7 100644 --- a/FilterExtension/ConfigNodes/customSubCategory.cs +++ b/FilterExtension/ConfigNodes/customSubCategory.cs @@ -26,7 +26,7 @@ public customSubCategory(ConfigNode node) iconName = node.GetValue("icon"); bool tmp; - bool.TryParse(node.GetValue("showUnPurchased"), out tmp); + bool.TryParse(node.GetValue("showUnpurchased"), out tmp); unPurchasedOverride = tmp; filters = new List(); @@ -49,6 +49,7 @@ public ConfigNode toConfigNode() node.AddValue("name", this.subCategoryTitle); node.AddValue("icon", this.iconName); + node.AddValue("showUnpurchased", this.unPurchasedOverride); foreach (Filter f in this.filters) node.AddNode(f.toConfigNode()); @@ -65,7 +66,6 @@ public bool checkFilters(AvailablePart part) if (!unPurchasedOverride && Core.Instance.hideUnpurchased && !ResearchAndDevelopment.PartModelPurchased(part) && !ResearchAndDevelopment.IsExperimentalPart(part)) return false; } - foreach (Filter f in filters) { if (f.checkFilter(part)) diff --git a/FilterExtension/Editor.cs b/FilterExtension/Editor.cs index 39e84c07..8e1c5ccd 100644 --- a/FilterExtension/Editor.cs +++ b/FilterExtension/Editor.cs @@ -13,6 +13,7 @@ namespace FilterExtensions class Editor : MonoBehaviour { public static Editor instance; + public bool ready = false; void Start() { instance = this; @@ -71,27 +72,27 @@ IEnumerator editorInit() { findPartsToBlock(); // not known until now which parts are never visible so some empty subcategories will be present - for (int i = 0; i < PartCategorizer.Instance.filters.Count; i++) - { - List subCatsToDelete = new List(); - PartCategorizer.Category C = PartCategorizer.Instance.filters[i]; - if (C == null) - continue; - for (int j = 0; j < C.subcategories.Count; j++) - { - PartCategorizer.Category sub = C.subcategories[j]; - if (sub == null) - continue; - - if (!PartLoader.Instance.parts.Any(p => sub.exclusionFilter.FilterCriteria.Invoke(p))) - subCatsToDelete.Add(sub); - } - for (int j = 0; j < subCatsToDelete.Count; j++) - { - PartCategorizer.Category sub = subCatsToDelete[j]; - C.subcategories.Remove(sub); - } - } + //for (int i = 0; i < PartCategorizer.Instance.filters.Count; i++) + //{ + // PartCategorizer.Category C = PartCategorizer.Instance.filters[i]; + // if (C == null) + // continue; + // int j = 0; + // while (j < C.subcategories.Count) + // { + // PartCategorizer.Category sub = C.subcategories[j]; + // if (sub == null) + // { + // j++; + // continue; + // } + + // if (!PartLoader.Instance.parts.Any(p => sub.exclusionFilter.FilterCriteria.Invoke(p))) + // C.subcategories.RemoveAt(j); + // else + // j++; + // } + //} } foreach (PartCategorizer.Category c in PartCategorizer.Instance.filters) Core.Instance.namesAndIcons(c); @@ -117,6 +118,8 @@ IEnumerator editorInit() if (Core.Instance.debug) Core.Log("Refreshing parts list"); Core.setSelectedCategory(); + + ready = true; } /// @@ -140,17 +143,15 @@ void findPartsToBlock() subCatsSeen.Add(subCat.button.categoryName); else // subcat created by another mod { - // can't remove parts from a collection being looped over, need to remember the visible parts - List visibleParts = new List(); - for (int j = 0; j < partsToCheck.Count; j++) + int j = 0; + while (j < partsToCheck.Count) { AvailablePart AP = partsToCheck[j]; if (subCat.exclusionFilter.FilterCriteria.Invoke(AP)) // if visible - visibleParts.Add(AP); + partsToCheck.RemoveAt(j); + else + j++; } - // remove all visible parts from the list to block - foreach (AvailablePart ap in visibleParts) - partsToCheck.Remove(ap); } } // add the blocked parts to a hashset for later lookup diff --git a/GameData/000_FilterExtensions/FilterExtensions.dll b/GameData/000_FilterExtensions/FilterExtensions.dll index 5d4ed8ad4e8747be4a8e15589dbc8ee1b32df37c..42b4273803f160026fc3d7e9cb56396c3a8c97dd 100644 GIT binary patch delta 7948 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 delta 8313 zcmbuE4O~@Kw!qgu=iYNa;9kx-_j2#$%Y+Nar->I5k}v|rFH*!xlte^Q3cM+3=|wK) zM}sjW9(6Ju)9jU&W^&C!n^DWYX3S~QrqRUGwE57|=GBaErop%NIw;OGzc=sq9{u>A zz1Ci9?X}n5`<#un9u-?Z6j%Q!VZgxM_dwsz=ODy~u`qzoQ6cHdmwP*3yw_gY3owBc z3`UEc@eVDXRay6*LDfL~{ajnc(%Cs}9~;EJ)XuPksMYAee@5f407htS0XQ85VA?ll zhJ_{y?+a=rfFUpyA^KARtU};^E#2s4)3gc3Q{i0i3Qvz$)WB3NN4ho}2G&3- zLJ0V^Eq5Ln3=vJ3VPEa!~mcHcx9UAJ686J}5uPaI_!aldXMn&xpZH<{Kjq z5~hKjZ)eR1B4U@ z+NRAH{S0@75SY))k&LRqAVf+E@0>0K8o7EX3jSf3wdl`9rWFW*F0RT$!G#m!$rxb0 z0bn>LBLo(plf$OiM&gFUtqd>#e=D&257ZFvuaP-i=!=>ueDd)6;FB6==nIh?KY(Y+#4?nG_o*)w)EqSuwLJu~&bATQVLJWV065S#wz z(ZS^~7{4d6=R>J|1Q)jCifJFNip>Wq_Pj);Br{f z2cn@x&%t_qIIF)1eUcRmI$0EpV$|(FR`7s342q#Yed-u7=-RbwH*^_Re~8aWPLEV& zD!U^rhWQKkE#L$;gIDjcAz1qOaI5tKrsJvI( zQkf9%5fg3~>39fmLL3ukp!NVE(1gRMMK_MqzNj3=PHHjt*9EWO{wu)!+IR{xcUb$E zq@@ClX-+%%oW^4stz1QVe<_Mq<)*}3`uaAb1(hn0gDu6{D}Bnn*I-5b8X~L_qglgU zw%iyTxbd{gN9EhZx?~A=z=jq%ePGZWXhE_6DEjfuZp|n)`RVPAyQPPRy&JPg!7Y`Z z;lmjJ?6M18GNb=R$79%$oE~hPfbI^1%VA9SNw`B+pc;2Ej}yH4yekqN_za6;z~)4B zQjEBZjEYh6cc9PEx9|v*@mOK$sv4Fui8oCWZuxR-C8K6CJ~J=iQib)pM&NtGUx;p} zac|lziZ#G%*8eIQajf^+wJIu8D?f*l9y&ZdMh(|PTj)inSOP!7D1Mp@cF`E8ag6Yr z$4Fzb{DoP?ZfRkCJEEJVoYlrw4ZUMLo?b7O`E`6w#P^-IylH;j+}T)905ku(<9ot; zPdS+90^kbmUBD}3hf>lUCjN@J#|3aJ`-J!va!}v!G46}Z!JcsQm>;A+94nPdq?;mw1}^C!+Zl z9@In3B#tCbAl48U6WfSeiQU9w#Ph_fL3-E+@^Fd7!NifoN@5dn1#uJcCE@|%2gEbP zKN5v_9xav_OyDPCeFER@SFmk`5#9tg0LEGc+$&#uQLw|=B<>*KCCd)c#9X8VP07{C z60~cd&H81q77v~UroxLL;)PEmsS;iS{!@Wx#sbq}7xm4?(_w+?K4~PL0}ITA-PBi% zTiOCOu!p1LjHLIe z??E_7(%(pW2o95!f)%hpJ-kKI1d;(n7ElaVTB2TvR5EV$D_Q9OY zpbPG{Ik9K9{C$K1$%BsITlP_9DK2fBQfrXld8H1yPw{{QHamMH2P}`~%#7)gB-mi% zHdEZ(UbYX!&qT7k3)}l`y!}JIXY0n#!A<%gNJj2pBkIl(-c=a7!Fv~eA)fKpAUD{q zB6lJg%uBpQW*{YbD8*7yf_!Qh6UP%LCnexCW>b4#GWY#W@w&1bMb7! z)hKxiLqB=w6CrP7j){K0_%F$_sVrR@XA~?J%cLdKjhQP&rcX`-%3#-13N* zJmZA|cw(HcI~KC|jRK1eMa-*VK^bp?m^!QvA0Yk|UcVuAu+31vK<{f7CJI~N5J~G{ zTlnqbRv3$a4sgHYLW%eS%qHm_I3?_W?J$EZm%^Lg0pfOOqQ0f@wxt7hz@-59TM7@^ z%ETQo!`G~f3vImf(H1VP^ehy(bc`H3AwO}Mc?WpNvJ>osw8X{~_PSQu7{eB8b&WA` z)$aL*U9e(Izw^uRV_kweZ7bTnt^KSqM)-TQcB(NtZghNuVGsPNy5GDD{;ErOJ5icq z*k&yg*`sR6B+J5VOuuqpDLR*S<`PxsBHClI5O!}dO217SA)%RQPhh|*@ zhxdYgKXmp`-C{_Py69T_ow_K1*d>5;yH3kr#i3a0tv) zZha{ZgIAZ}=gHgfohIMZ_a@xg*Y|buH+c2at}IAcvoL(-<2L-a8t9Suo%0+L-yEcA zC$1xIASUCDlHnQWe1$YRM>x1f_tm-4Cd&eBA)B2xeIzNU$JKqVk0;9_{9ck}16)QL zp^JR>lm9_#b4xux25*z*J>oBj$BC+u+iaxvMw@^$`Hb2!-qaX4kOHW|8%Ec=UDT~l zPUmpa=-iH9CI%kT#88NMq}VsnB+~0lyU`Y4uwA%evmcYtiz>oFTabtASN-cYug7JY z@pa1|YW|OLfZ~xDFJ!u16{fE?fwfZ%|>!s*d{r@!mb<%73Z#b5U z&)|pKRo|HUs{j7R46ZMbz76ldN(fL$^%$vDFN#ajz4)fPzMpuV{?Ti+wrx>ra6EbG z+g9KH`o`4T8}L4K{XjjA_a6qQ@uqYApxu1v{x|I&{8lm0W9n?X4X-2D&yGH%o{E%2 zrj)caNW@R70q=iF@HPJ44@p{J@k7CNvJdYM{578kPs%LNvcajg8Om6!`lO*6yxNk0JLppnplPZ4E@~cD zk79cTay$jfrsQH_oq7&^`H-=&S=|AXq0D;4P)V#~+f{>cR$tOxYN9b44y(hA_3$fo zw2_Zhif#V3{x!Rzc3>v4>SSXb>ryL?O|USCRcRuJW^!nvVVcRI39h0;9qUz_jmtrF ztfp`q(Tyj;18p^)WG;sf+9}25lx`V&(7~swC(SL_Vtj|RiQ+G(_}vu0jIDG86Q#+} z;YdTKDMO@o3XRL;m@cKlHpe`P8!eRnz&^sDW$cuL4}8JVEPcaV&d1Ou*0~BffH;tt zfK(vSxfYq{d>SJh7aH&e#IFm>`x518ZloV5TVHEvLg2FWg~{MxJv{m+IIz&SqmCydfu<_R=Kx zlJ6VHG$|D=t4+aFAuMvX=?LXj2ukEGXk$^4kC+PaQ?LsP!5g{Kv;#&&t}sM``U(V9?8A6D`x}J`LYnf57^c8c$ICSlAzV%5;Lf&XZkx{ z<%!)_nel_siR)(#>!elRfJ;y&R9n3*0G`PC1Fie%N^i|c?qKpbvGC~G1_X=9=IjOhsStIybmKRkLRz)q3&RV zAxq#!&9qMEY3-L&xMs}pvbdbWHPbNdq`yQqYpK1KdfSPG@HGZ4g#W@6%UDxFwS5Py zN|a2 zG1d4qCDaWU@S^_8@07Q)!O0_KMH-bnR<4G!y!QyjJc1)C!;Ih4kVj~M z@7brJX^$~BE&$IegW(})M=paz7z~ZD0ox96BV!;F=_RHUec(gQa2Sg$B277Q8q5s6 zuq?pX7h2qkFH9`#2@DpmnO1I$+!9@GO@u>4h~e#lG3DB8D<6rUB(Igb^2c&dXj_}e*r3q1RTd%QHhB@43?`_+p(+4EueO)j zLg7!RnG$`zEMHMk-l)u?;_U3q>|wqknYr1ciZXNWD$dTjEqBzAqG2OLQ@7SfXolxx zmZKecrwe>7hU&)Yf)2+#IP!F*QfcF{`bs&1#M|t|xv-qRI9@ zTX6@YiK(q?F?#D$T6<4SmeP6w$IUX?C}KPhkjm_O{CKk(kN>r9;&>`jH`Pw}?6oiN s<$o&cKbw2C&1a$|{eS(3_Me%|)_gW3WdHoHqVP&VNI8F*bq+E8H|&m`JOBUy diff --git a/GameData/000_FilterExtensions/FilterExtensions.version b/GameData/000_FilterExtensions/FilterExtensions.version index 391357c6..532484f8 100644 --- a/GameData/000_FilterExtensions/FilterExtensions.version +++ b/GameData/000_FilterExtensions/FilterExtensions.version @@ -1 +1 @@ -{"NAME":"Filter Extensions","URL":"https://github.com/Crzyrndm/FilterExtension/blob/master/GameData/000_FilterExtensions/FilterExtensions.version","DOWNLOAD":"https://github.com/Crzyrndm/FilterExtension/releases","VERSION":{"MAJOR":2,"MINOR":4,"PATCH":0,"BUILD":0},"KSP_VERSION":{"MAJOR":1,"MINOR":0,"PATCH":4}} \ No newline at end of file +{"NAME":"Filter Extensions","URL":"https://github.com/Crzyrndm/FilterExtension/blob/master/GameData/000_FilterExtensions/FilterExtensions.version","DOWNLOAD":"https://github.com/Crzyrndm/FilterExtension/releases","VERSION":{"MAJOR":2,"MINOR":4,"PATCH":1,"BUILD":0},"KSP_VERSION":{"MAJOR":1,"MINOR":0,"PATCH":4}} \ No newline at end of file