public static void ReloadParams() { if (!File.Exists(ParamPath)) { Debug.Log("Data0.bdt not found. This will make treasure editor have less functionality."); return; } BND4 paramBnd = SFUtil.DecryptDS3Regulation(DarkSoulsTools.GetOverridenPath(ParamPath)); DS3Param = PARAM.Read(paramBnd.Files.Find(x => Path.GetFileName(x.Name) == "ItemLotParam.param").Bytes); PARAM.Layout layout = PARAM.Layout.ReadXMLFile($@"{Application.dataPath.Replace('/', '\\')}\dstools\ParamLayouts\DS3\{DS3Param.ID}.xml"); DS3Param.SetLayout(layout); // Build and cache the item name list HashSet <int> usedItemIds = new HashSet <int>(); ItemNameList = new List <Tuple <int, string> >(); foreach (var row in DS3Param.Rows) { ItemLotParam param = new ItemLotParam(row); foreach (int id in param.ItemID) { if (!usedItemIds.Contains(id)) { usedItemIds.Add(id); ItemNameList.Add(new Tuple <int, string>(id, FMGUtils.LookupItemName(id))); } } } ItemNameList.Sort((a, b) => StringComparer.InvariantCulture.Compare(a.Item2, b.Item2)); }
protected void DrawTreasureEditor() { ShowTreasureEditor = EditorGUILayout.Foldout(ShowTreasureEditor, "Treasure Editor"); if (ShowTreasureEditor) { if (serializedObject.targetObjects.Count() == 1) { if (GUILayout.Button("Go to Target Object")) { var objectName = serializedObject.FindProperty("PartName2").stringValue; var obj = GameObject.Find($@"/MSBParts/Objects/{objectName}"); if (obj == null) { obj = GameObject.Find($@"/MSBParts/DummyObjects/{objectName}"); } if (obj == null) { EditorUtility.DisplayDialog("Object not found", $@"Couldn't find object {obj}", "Ok"); } else { Selection.activeGameObject = obj; SceneView.FrameLastActiveSceneView(); } } var itemLots = new int[2]; itemLots[0] = serializedObject.FindProperty("ItemLot1").intValue; itemLots[1] = serializedObject.FindProperty("ItemLot2").intValue; foreach (var lot in itemLots) { if (lot == -1) { EditorGUILayout.LabelField($@"Lot Param: No lot"); } else { EditorGUILayout.LabelField($@"Lot Param: {lot}"); EditorGUI.indentLevel++; var lotParam = ItemLotParamUtils.LookupItemLot(lot); if (lotParam != null) { EditorGUILayout.BeginVertical(); for (int i = 0; i < 8; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField($@"Item ID {i + 1}:", GUILayout.MaxWidth(80.0f)); lotParam.ItemID[i] = EditorGUILayout.IntField(lotParam.ItemID[i]); if (EditorGUILayout.DropdownButton(new GUIContent($@"{FMGUtils.LookupItemName(lotParam.ItemID[i])}"), FocusType.Keyboard)) { GenericMenu menu = new GenericMenu(); foreach (var item in ItemLotParamUtils.ItemNameList) { if (item.Item2 == "?ItemName?") { continue; } menu.AddItem(new GUIContent($@"{item.Item2} ({item.Item1})"), item.Item1 == lotParam.ItemID[i], o => { Tuple <int, ItemLotParam, int, int> stuff = (Tuple <int, ItemLotParam, int, int>)o; stuff.Item2.ItemID[stuff.Item4] = stuff.Item3; ItemLotParamUtils.UpdateItemLot(stuff.Item1, stuff.Item2); this.Repaint(); }, new Tuple <int, ItemLotParam, int, int>(lot, lotParam, item.Item1, i)); } menu.ShowAsContext(); } EditorGUILayout.EndHorizontal(); } ItemLotParamUtils.UpdateItemLot(lot, lotParam); EditorGUILayout.EndVertical(); } EditorGUI.indentLevel--; } } if (GUILayout.Button("Save Params")) { ItemLotParamUtils.SaveParams(); } } } }