using MongoDB.Bson.Serialization.Attributes; using Sirenix.OdinInspector; using System.Collections; using System.Collections.Generic; using System.IO; using ET; using System; #if UNITY_EDITOR using System.Linq; using UnityEngine; #endif namespace Cal { #if UNITY [Serializable] public class DictionaryInt32Single : Dictionary, ISerializationCallbackReceiver { [SerializeField] private List keys = new List(); [SerializeField] private List values = new List(); public void OnBeforeSerialize() { keys.Clear(); values.Clear(); foreach (KeyValuePair pair in this) { keys.Add(pair.Key); values.Add(pair.Value); } } public void OnAfterDeserialize() { this.Clear(); if (keys.Count != values.Count) throw new System.Exception("there are " + keys.Count + " keys and " + values.Count + " values after deserialization. Make sure that both key and value types are serializable."); for (int i = 0; i < keys.Count; i++) this.Add(keys[i], values[i]); } } #endif [GUIColor(0.8f, 0.8f, 1f)] [BsonIgnoreExtraElements] [HideReferenceObjectPicker] [System.Serializable] public class SkillParam { [LabelText("变化性数值")] [DictionaryDrawerSettings(KeyLabel = "等级", ValueLabel = "数值")] [ShowIf("skillSourcetype", SkillSourcetype.Changable)] [BsonDictionaryOptions(Representation = MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)] #if UNITY [SerializeField] public DictionaryInt32Single values; #else public Dictionary values; #endif [HideInInspector] public SkillSourcetype skillSourcetype; #if UNITY [BsonIgnore] [LabelText("变化最大等级")] [PropertyRange(0, 15), PropertyOrder(-1)] [ShowInInspector] [ShowIf("skillSourcetype", SkillSourcetype.Changable)] private int maxLevel { get { if (values == null) return 0; if (values.Count == 0) return 0; return values.Last().Key; } set { var dic = new DictionaryInt32Single(); for (int i = 1; i <= value; i++) { if (values != null && values.TryGetValue(i, out var _value)) dic.Add(i, _value); else dic.Add(i, 0); } values = dic; } } #endif [LabelText("输入数值")] [ShowIf("skillSourcetype", SkillSourcetype.Constage)] public float value; //#if SERVER // public SkillDataTableArgs args; //#endif #if UNITY_EDITOR //[LabelText("选择参数")] //[ShowIf("skillSourcetype", SkillSourcetype.Changable)] //public SkillDataTableArgs args //{ // get => SkillDataTableArgs.Args0; set // { // if (skillSourcetype == SkillSourcetype.Constage) // { // values = null; // } // else if (skillSourcetype == SkillSourcetype.Changable) // { // if (dic.Count == 0) // { // GenerateDic(); // } // if (!dic.TryGetValue(skillId_, out var _dic)) // { // Log.Error($"@dic has not the key = {skillId_}"); // return; // } // values = new Dictionary(); // foreach (var kv in _dic) // { // int level = kv.Key; // if (!kv.Value.TryGetValue((int)value, out var floatValue)) // { // //Log.Error($"@_dic has not the key = {skillId_} args = {value}"); // continue; // } // values.Add(level, floatValue); // } // } // else // { // values = null; // } // } //} #region Excel // private void GenerateDic() // { // NPOI.XSSF.UserModel.XSSFWorkbook workbook; // using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) // { // workbook = new XSSFWorkbook(file); // } // ISheet sheet = workbook.GetSheetAt(0); // for (int i = 4; i < 500; i++) // { // for (int j = 10; j < 30; j++) // { // int id = int.Parse(GetCellString(sheet, i, 1)); // string str = GetCellString(sheet, i, j); // if (str != "") // { // if (!dic.TryGetValue(id / 100, out var _dic)) // { // dic[id / 100] = _dic = new Dictionary>(); // } // if (!_dic.TryGetValue(id % 100, out var __dic)) // { // _dic[id % 100] = __dic = new Dictionary(); // } // __dic.Add(j - 10, float.Parse(str)); // } // } // } // } // private static string GetCellString(ISheet sheet, int i, int j) // { // IRow _irow = sheet.GetRow(i); // if (_irow != null) // { // return GetCellString(_irow, j); // } // return ""; // } // private static string GetCellString(IRow row, int i) // { // ICell _icell = row.GetCell(i); // if (_icell != null) // { // return GetCellString(_icell); ; // } // return ""; // } // private static string GetCellString(ICell cell) // { // if (cell != null) // { // if (cell.CellType == CellType.Numeric || (cell.CellType == CellType.Formula && cell.CachedFormulaResultType == CellType.Numeric)) // { // return cell.NumericCellValue.ToString(); // } // else if (cell.CellType == CellType.String || (cell.CellType == CellType.Formula && cell.CachedFormulaResultType == CellType.String)) // { // return cell.StringCellValue.ToString(); // } // else if (cell.CellType == CellType.Boolean || (cell.CellType == CellType.Formula && cell.CachedFormulaResultType == CellType.Boolean)) // { // return cell.BooleanCellValue.ToString(); // } // else // { // return cell.ToString(); // } // } // return ""; // } #endregion [Button("不需要数值")] [ButtonGroup("param")] void NoneParam() { skillSourcetype = SkillSourcetype.None; values = null; } [Button("固定型数值")] [ButtonGroup("param")] void InputParam() { skillSourcetype = SkillSourcetype.Constage; values = null; } [Button("变化型数值")] [ButtonGroup("param")] void DataTableParam() { skillSourcetype = SkillSourcetype.Changable; } #endif } [HideReferenceObjectPicker] [Serializable] public class ValueCalculate { [LabelText("伤害计算类型")] public ValueCalculateType calculateType; [LabelText("伤害系数(XX%)")] [SerializeField] public SkillParam param; } }