using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text.RegularExpressions; using LitJson; using Newtonsoft.Json.Linq; using ProtoCSStruct; using SimpleHttpServer; using Sog; namespace Operation { [MenuMapping(refc = typeof(SendEmail))] public class GameData { [RequestMapping("查找道具", PermissionCode.ITEM_SEARCHG)] public static int OnGetItemListHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { var goodsType = query.GetValue("type").Toint32((int)GoodsType.Items); JsonData data1 = new JsonData(); switch (goodsType) { case (int)GoodsType.Items: { foreach (var item in ItemDescMgr.Instance.ItemTable) { string nameKey = string.Format("item{0}", item.Value.itemID); var lang = LanguageDescMgr.Instance.GetConfig(nameKey); if (lang != null) { nameKey = lang.ZH; } data1[string.Concat(item.Value.itemID)] = nameKey + "_" + item.Value.itemID; } } break; case (int)GoodsType.Equipment: { foreach (var item in EquipDescMgr.Instance.ItemTable) { var equipId = item.Value.id; data1[equipId + ""] = equipId; } } break; case (int)GoodsType.EquipSkin: { foreach (var item in RoleModelDescMgr.Instance.ItemTable) { var id = item.Value.id; data1[id + ""] = item.Value.id; } } break; case (int)GoodsType.Gem: { foreach (var item in GemDescMgr.Instance.ItemTable) { var id = item.Value.id; data1[id + ""] = item.Value.id; } } break; } jsondata["data"] = data1; return 0; } [RequestMapping("查找道具价值", PermissionCode.COST_PLAYER_ITEM, true)] public static int OnGetItemCostHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { RepeatedFixedStructString128_10 data = new RepeatedFixedStructString128_10(); HttpApiRootHandler.FillHttpApiDbReq2MessageTaskDistributor(httpApiCmd, httpContextId, ref data); rsp.IsWaitFor = true; return 0; } public static int DoOnGetItemCostHttpRes(string httpApiCmd, SSHttpApiDbReq req, DBOperator dbOperator) { TraceLog.Trace("PlayerInfoOp.DoSelectPlayerOp HttpContextId {0}", req.HttpContextId); HttpRequestInfo m_request = null; LitJson.JsonData builder = new LitJson.JsonData(); try { var httpContextId = req.HttpContextId; m_request = OperationServer.m_httpService.m_requestList.Find(f => f.Http.id == httpContextId); dbOperator.DbSelectItemCostAll(builder); } catch (Exception ex) { TraceLog.Error("PlayerInfoOp.DoSelectPlayerOp Error Msg {0}", ex.Message); } finally { if (m_request != null) { m_request.Http.httpResponse.ContentAsUTF8 = builder.ToJson(); m_request.ProcessEnd = true; } } TraceLog.Trace("PlayerInfoOp.DoSelectPlayerOp success httpContextId {0}", req.HttpContextId); return 0; } [RequestMapping("添加道具价值", PermissionCode.ADD_COST_ITEM)] public static int OnInsertItemCostHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { RepeatedFixedStructString128_10 data = new RepeatedFixedStructString128_10(); int itemId = query.GetValue("itemId").Toint32(0) == 0 ? 10 : query.GetValue("itemId").Toint32(0); float cn = query.GetValue("cnCost").ToFloat(0) == 0 ? 1 : query.GetValue("cnCost").ToFloat(0); float kr = query.GetValue("krCost").ToFloat(0) == 0 ? 1 : query.GetValue("krCost").ToFloat(0); float jp = query.GetValue("jpCost").ToFloat(0) == 0 ? 1 : query.GetValue("jpCost").ToFloat(0); float en = query.GetValue("enCost").ToFloat(0) == 0 ? 1 : query.GetValue("enCost").ToFloat(0); data.Add(itemId.ToString()); data.Add(cn.ToString()); data.Add(kr.ToString()); data.Add(jp.ToString()); data.Add(en.ToString()); HttpApiRootHandler.FillHttpApiDbReq2MessageTaskDistributor(httpApiCmd, httpContextId, ref data); rsp.IsWaitFor = true; return 0; } public static int DoOnInsertItemCost(string httpApiCmd, SSHttpApiDbReq req, DBOperator dbOperator) { TraceLog.Trace("GameData.DoOnInsertItemCost HttpContextId {0}", req.HttpContextId); HttpRequestInfo m_request = null; LitJson.JsonData builder = new LitJson.JsonData(); try { var httpContextId = req.HttpContextId; m_request = OperationServer.m_httpService.m_requestList.Find(f => f.Http.id == httpContextId); if (req.Data.Count < 4) { TraceLog.Error("GameData.DoOnInsertItemCost param error"); builder["ret"] = 2; builder["msg"] = "参数错误"; } else { dbOperator.DbInsertItemCost(builder, int.Parse(req.Data[0].ToString()), float.Parse(req.Data[1].ToString()), float.Parse(req.Data[3].ToString()), float.Parse(req.Data[3].ToString()), float.Parse(req.Data[3].ToString())); } } catch (Exception ex) { TraceLog.Error("GameData.DoOnInsertItemCost Error Msg {0}", ex.Message); } finally { if (m_request != null) { m_request.Http.httpResponse.ContentAsUTF8 = builder.ToJson(); m_request.ProcessEnd = true; } } TraceLog.Trace("PlayerInfoOp.DoOnInsertItemCost success httpContextId {0}", req.HttpContextId); return 0; } [RequestMapping("删除道具价值", PermissionCode.DELETE_COST_ITEM)] public static int OnDeleteItemCostHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { RepeatedFixedStructString128_10 data = new RepeatedFixedStructString128_10(); int itemId = query.GetValue("itemId").Toint32(0) == 0 ? 10 : query.GetValue("itemId").Toint32(0); data.Add(itemId.ToString()); HttpApiRootHandler.FillHttpApiDbReq2MessageTaskDistributor(httpApiCmd, httpContextId, ref data); rsp.IsWaitFor = true; return 0; } public static int DoOnDeleteItemCost(string httpApiCmd, SSHttpApiDbReq req, DBOperator dbOperator) { TraceLog.Trace("PlayerInfoOp.DoSelectPlayerOp HttpContextId {0}", req.HttpContextId); HttpRequestInfo m_request = null; LitJson.JsonData builder = new LitJson.JsonData(); try { var httpContextId = req.HttpContextId; m_request = OperationServer.m_httpService.m_requestList.Find(f => f.Http.id == httpContextId); if (req.Data.Count < 1) { TraceLog.Error("PlayerInfoOp.DoSelectPlayerOp param error"); builder["ret"] = 2; builder["msg"] = "参数错误"; } else { dbOperator.DbDeleteItemCost(builder, int.Parse(req.Data[0].ToString())); } } catch (Exception ex) { TraceLog.Error("PlayerInfoOp.DoSelectPlayerOp Error Msg {0}", ex.Message); } finally { if (m_request != null) { m_request.Http.httpResponse.ContentAsUTF8 = builder.ToJson(); m_request.ProcessEnd = true; } } TraceLog.Trace("PlayerInfoOp.DoSelectPlayerOp success httpContextId {0}", req.HttpContextId); return 0; } [RequestMapping("数值配置查询", PermissionCode.SELECT_GAME_DATA, true, ignored: true)] public static int OnGetGameDataConfigHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { OperationServer.UpdateCurrency(); var name = query.GetValue("name"); if (string.IsNullOrEmpty(name)) { return -1; } var targetKey = query.GetValue("targetKey"); var targetValue = query.GetValue("targetValue"); name += ".bin"; jsondata["ret"] = 0; var mgr = GameConfigMgr.Instance.GetConfigMgr(name); jsondata["data"] = GetData(jsondata, mgr, targetKey, targetValue); return 1; } public static JsonData GetData(JsonData jsondata, IConfigManager mgr, string targetKey = "", string targetValue = "") { var type = mgr.GetType(); var prps = type.GetProperties(); JsonData data = new JsonData(); foreach (var prp in prps) { var pv = prp.GetValue(mgr); if (pv == null) { continue; } if (pv.GetType().FullName == mgr.GetType().FullName) { continue; } if (!prp.PropertyType.IsGenericType || prp.PropertyType.GetGenericTypeDefinition() != typeof(SortedList<,>)) { continue; } // 如果属性是 SortedList,获取键值对 if (prp.GetValue(mgr) is not IDictionary sortedListValue) { continue; } var dog = 0; foreach (DictionaryEntry entry in sortedListValue) { var descObj = entry.Value; if (descObj == null) { continue; } var descType = descObj.GetType(); var descps = descType.GetProperties(); if (descType.Name.Contains("Desc")) { Build(data, descps, descObj, targetKey, targetValue); jsondata["count"] = descps.Length; } if (descObj is not IDictionary subSortListValue) { continue; } foreach (DictionaryEntry subEnt in subSortListValue) { var subDescObj = subEnt.Value; if (subDescObj == null) { continue; } var subDescType = subDescObj.GetType(); var subDescps = subDescType.GetProperties(); if (subDescType.Name.Contains("Desc")) { Build(data, subDescps, subDescObj, targetKey, targetValue); jsondata["count"] = subDescps.Length; } } } break; } return data; } public static int OnGetGameDataConfigNamesHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { List list = GameConfigMgr.Instance.GetConfigNames(); JsonData json = new JsonData(); foreach (var name in list) { json.Add(name.Split(".")[0]); } jsondata["data"] = json; jsondata["code"] = 0; jsondata["ret"] = 0; return 1; } public static void Build(JsonData data, PropertyInfo[] descPropertyInfos, object descObj, string targetKey, string targetValue) { var json = new JsonData(); foreach (var propertyInfo in descPropertyInfos) { var filedKey = propertyInfo.Name; bool filterValue = false; if (!string.IsNullOrEmpty(targetKey)) { if (targetKey == filedKey) { filterValue = true; } } var filedVal = propertyInfo.GetValue(descObj); if (filedVal == null) { return; } if (ReferenceEquals(filedVal, "")) { json[filedKey] = ""; } else { var empty = string.Empty; switch (filedVal) { case int: { var obj = int.Parse(filedVal.ToString() ?? empty); if (filterValue && !string.IsNullOrEmpty(targetValue) && obj != int.Parse(targetValue)) { return; } json[filedKey] = obj; } break; case long: { var obj = long.Parse(filedVal.ToString() ?? empty); if (filterValue && !string.IsNullOrEmpty(targetValue) && obj != long.Parse(targetValue)) { return; } json[filedKey] = obj; } break; case double: { var obj = double.Parse(filedVal.ToString() ?? string.Empty); if (filterValue && !string.IsNullOrEmpty(targetValue) && Math.Abs(obj - double.Parse(targetValue)) != 0) { return; } json[filedKey] = obj; } break; case float: { var obj = float.Parse(filedVal.ToString() ?? string.Empty); if (filterValue && !string.IsNullOrEmpty(targetValue) && Math.Abs(obj - float.Parse(targetValue)) != 0) { return; } json[filedKey] = obj; } break; case string: { var obj = filedVal.ToString(); if (filterValue && !string.IsNullOrEmpty(targetValue) && obj != targetValue) { return; } json[filedKey] = obj; } break; case JArray array: { json[filedKey] = array.ToString(); break; } case JObject jObject: { json[filedKey] = jObject.ToString(); break; } default: { var obj = filedVal.ToJsonstr(); json[filedKey] = obj; } break; } } } data.Add(json); } static string GetComment(MemberInfo memberInfo) { // 获取字段的注释 var commentRegex = new Regex(@"//\s*([^\r\n]*)"); var sourceFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, memberInfo.Module.Name.Replace(".dll", ".cs")); var lines = File.ReadAllLines(sourceFile); foreach (var line in lines) { var match = commentRegex.Match(line); if (match.Success) { return match.Groups[1].Value.Trim(); } } return "N/A"; } } }