@@ -36,12 +36,13 @@ public ItemInfo(int groupNo, int categoryNo, int localSlot, Info.ItemLoadInfo st
3636 GUID = zipmodInfo . GUID ;
3737 ZipmodSlot = zipmodInfo . Slot ;
3838 DeveloperSearchString += "\v " + ZipmodSlot ;
39- NewCacheId = MakeNewCacheId ( groupNo , categoryNo , ZipmodSlot ) ;
39+ NewCacheId = MakeNewCacheId ( groupNo , categoryNo , ZipmodSlot , zipmodInfo . GUID ) ;
40+ NewCacheIdShort = MakeNewCacheId ( groupNo , categoryNo , ZipmodSlot , null ) ;
4041 }
4142 else
4243 {
4344 ZipmodSlot = - 1 ;
44- NewCacheId = MakeNewCacheId ( groupNo , categoryNo , LocalSlot ) ;
45+ NewCacheId = NewCacheIdShort = MakeNewCacheId ( groupNo , categoryNo , LocalSlot , null ) ;
4546 }
4647
4748 if ( zipmodFilename != null )
@@ -165,6 +166,11 @@ public ItemInfo(int groupNo, int categoryNo, int localSlot, Info.ItemLoadInfo st
165166 [ Obsolete ( "Will be removed" , true ) ]
166167 public string CacheId => OldCacheId ;
167168 internal string NewCacheId { get ; }
169+ /// <summary>
170+ /// Only for backwards compatibility, turns out the ID wasn't unique across zipmods
171+ /// </summary>
172+ [ Obsolete ]
173+ internal string NewCacheIdShort { get ; }
168174 [ Obsolete ]
169175 internal string OldCacheId { get ; }
170176
@@ -202,7 +208,7 @@ public void AddItem()
202208 // Some modded items crash in Studio.OCIItem.UpdateColor()
203209 }
204210 }
205-
211+
206212 private void UpdateCompositeStrings ( )
207213 {
208214 FullName = GroupName + "/" + CategoryName + "/" + ItemName ;
@@ -221,10 +227,13 @@ private void UpdateCompositeStrings()
221227 SearchString = searchStr . Replace ( ' ' , '_' ) . ToLowerInvariant ( ) ;
222228 }
223229
224- private static string MakeNewCacheId ( int groupNo , int categoryNo , int slotNo )
230+ private static string MakeNewCacheId ( int groupNo , int categoryNo , int slotNo , string guid )
225231 {
226232 // Sideloader generated local slot numbers start at 100000000, so real slot numbers should have at most 8 digits
227- return $ "{ groupNo : D8} -{ categoryNo : D8} -{ slotNo : D8} ";
233+ var str = $ "{ groupNo : D8} -{ categoryNo : D8} -{ slotNo : D8} ";
234+ if ( guid != null )
235+ str += $ "-{ Utils . GetHashCode ( guid ) : X8} "; // Pretty much the same as using full guid string. Trimming hash to 4 bytes causes a lot of collisions.
236+ return str ;
228237 }
229238
230239 [ Obsolete ]
@@ -256,7 +265,7 @@ public string ToDescriptionString()
256265
257266 var sb = new StringBuilder ( ) ;
258267 sb . AppendLine ( FullName ) ;
259-
268+
260269 sb . Append ( $ "Group = { GroupNo } Category = { CategoryNo } ") ;
261270 if ( isZipmod ) sb . Append ( $ " LocalSlot = { LocalSlot } ZipmodSlot = { ZipmodSlot } ") ;
262271 else sb . Append ( $ " Slot = { LocalSlot } ") ;
0 commit comments