using System; using System.Collections.Generic; using System.Linq; using System.IO; using System.Reflection; using Sog; using ProtoCSStruct; using Sog.IO; using LitJson; using System.Text; using Sog.Gate; namespace Game { public static class GmStaticData { public static SimpleRobotPool robotPool = new SimpleRobotPool(); public static SimpleRobotList robotList = new SimpleRobotList(); } public partial class GmCmdSvc : BaseReloadableService { public override int GetServiceType() { return GameServiceType.GmCmdSvc; } //销毁的时候清空指令注册 public override void Dispose() { GmCommandMgr.Instance.ClearAll(); } //构造的时候注册所有指令 public GmCmdSvc() { GmCommandMgr.Instance.Init(this); RegisterAllGmCmd(); ScanGmRequestApi(); } private void ScanGmRequestApi() { var methods = this.GetType().GetMethods(); foreach (var method in methods) { var attribute = method.GetCustomAttribute(); if (attribute == null) { continue; } GmCommandMgr.Instance.Register(attribute, method); } } /** * * 不建议使用这个方法,因为这样客户端就没办法拿到关于某个接口的信息,还需要手动输入, * 建议采用 方式,客户端能够自动拉去gm相关的api以及 * 对应的参数。通过可视化窗口填入对应的数值即可完成相关的调用。 * 随着新的业务开发,渐渐的把这老的方式都替换去掉 * */ [Obsolete("不建议使用")] private void RegisterAllGmCmd() { //注册广播事件 GmCommandMgr.Instance.NotifyWorldBroadCastGMCmdToServer = NotifyWorldBroadCastGMCmdToServer; } public static void OnCliGmCmd(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("GmCmdSvc.OnCliGmCmd uid {0} no player obj", playerSession.UserID); return; } var cfg = GameServerUtils.GetServerConfig(); if (cfg.isAllGM != 1 && (cfg.gmUid == null || !cfg.gmUid.Contains(player.UserID))) { TraceLog.Error("GmCmdSvc.OnCliGmCmd uid {0} not gm", player.UserID); return; } ref CSGmCmd Gm = ref packet.GetMessage(); long opUid = player.UserID; if (Gm.CmdStr.ToString().Contains(' ')) { List initgmCmdParams = new List(); string[] splitStr = Gm.CmdStr.ToString().Split(' '); string gmcmd = splitStr[0]; List paramList = new List(); paramList.AddRange(splitStr); for (int i = 1; i < paramList.Count; i++) { string param = paramList[i]; //gm指令本身支持base64转码 //gmcmd AddGold 500000000 -t 1000001 // -txxxxx if (param.Length >= 6 && param[0] == '-' && param[1] == 't') { long.TryParse(param.Substring(2), out opUid); continue; } if (param == "-t") { if (i <= paramList.Count - 2) { i++; long.TryParse(paramList[i], out opUid); continue; } else { TraceLog.Error("OnCliGmCmd error"); return; } } //用base64编码替换AddChip后面的参数 //gmcmd AddGold -bNTAwMDAwMDAwIC10IDEwMDAwMDE= //gmcmd AddGold -b NTAwMDAwMDAwIC10IDEwMDAwMDE= //以上两种都可以 //处理一下base64编码参数 string base64 = null; // -bxxxxx if (param.Length >= 6 && param[0] == '-' && param[1] == 'b') { base64 = param.Substring(2); } if (param == "-b") { if (i <= paramList.Count - 2) { i++; base64 = paramList[i]; } } if (base64 != null) { byte[] byte64 = Convert.FromBase64String(base64); string decodeText = Encoding.UTF8.GetString(byte64); string[] decodesplitStr = decodeText.Split(' '); paramList.AddRange(decodesplitStr); } else { if (paramList[i] != "") { initgmCmdParams.Add(paramList[i]); } } } string[] gmCmdParams = initgmCmdParams.ToArray(); string allparamString = string.Empty; for (int i = 0; i < gmCmdParams.Length; i++) { allparamString += gmCmdParams[i]; if (i != gmCmdParams.Length - 1) { allparamString += ' '; } } TraceLog.Debug("ProcessShmCommand_GmCommand cmd:{0} userid {1} params {2}" , gmcmd, playerSession.UserID, allparamString); GmCommandMgr.Instance.HandlerGmCommand(gmcmd, opUid, gmCmdParams, false); } //派发一个使用GM的事件,用来刷新数据 GameServerUtils.GetEventHandlerMgr().OnClientUseGM(player); } //广播来的指令 public static void OnWorldNotifyDealGmCmd(StructPacket packet) { ref SSNotifyServerDealGMCmd gmCmd = ref packet.GetMessage(); string[] splitStr = gmCmd.CmdParams.GetString().Split(' '); GmCommandMgr.Instance.HandlerGmCommand(gmCmd.GmCmd.GetString(), gmCmd.UserId, splitStr, true, true); } /// /// 是否过滤GM账号 /// /// /// true, 要过滤, false 不要过滤 public static bool IsGMFilter(long uid) { var cfg = GameServerUtils.GetServerConfig(); if (cfg.isAllGM != 1 && cfg.gmUid != null && cfg.gmUid.Contains(uid)) { TraceLog.Trace("GmCmdSvc.IsGMFilter uid {0}", uid); return true; } return false; } /// /// 是否GM /// /// /// true, 是GM, false 不是GM/returns> public static bool IsGM(long uid) { GameServerConfig cfg = GameServerUtils.GetServerConfig(); if (cfg.isAllGM == 1) { return true; } if (cfg.gmUid != null && cfg.gmUid.Contains(uid)) { return true; } return false; } [GmApiMapping(desc: "添加经验",help: "添加后自动升级")] public int AddExp(long userid, int iExp) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddExp can not find palyer by uid {0}", userid); return -2; } player.Trace("GmCmdSvc.AddExp uid {0} exp {1}", userid, iExp); LevelUtils.AddExp(player, iExp, BillChangeItemReason.GmCmd); TraceLog.TraceDetail("GmCmdSvc.AddExp day param player:{0} cm:{1}", player.UserID, iExp); return 0; } // filename chip diamond itemId itemNum [GmApiMapping(desc: "删除邮件",group:GmGroup.SERVER)] public int DeleteMail(long userid, uint mailID) { if (mailID == 0) { TraceLog.Error("GmCmdSvc.DeleteMail invalid mailid param {0}", mailID); return -2; } DBMail mail = new DBMail(); mail.MailID = mailID; mail.Uid = userid; MailSender.SendMailOpReqToDB(0, MailOpType.Delete, ref mail); return 0; } [GmApiMapping(desc: "发送邮件", group: GmGroup.SERVER)] public int SendMail(long userid, int mailID) { if (mailID == 0) { TraceLog.Error("GmCmdSvc.SendMail invalid mailid param {0}", mailID); return -2; } PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); MailSender.SendNewMailToPlayer(player, mailID); return 0; } [GmApiMapping(desc: "设置服务器时间", group: GmGroup.SERVER)] public int AddServerTime(long userid, uint second) { if (GameServerUtils.GetServerConfig().permitAddServerTime != 1) { TraceLog.Error( "GmCmdSvc.AddServerTime this server can not exec AddServerTime, server config permitAddServerTime = {0}" , GameServerUtils.GetServerConfig().permitAddServerTime); return -1; } if (second == 0) { TraceLog.Error("GmCmdSvc.AddServerTime invalid timesecond param {0}", second); return -2; } long nowOffset = GameServerUtils.GetApp().Time.AddOffset(second); GameServerUtils.GetApp().Time.UpdateTime(); // 在线玩家同步最新时间 CSPing ping = new CSPing { ServerTime = GameServerUtils.GetTimeMs() }; var sessionTable = GameServerUtils.GetPlayerTable().m_sessionsTable; foreach (PlayerSession session in sessionTable.Values) { GateService.SendToGate(session.UserID, GameServerUtils.GetApp().GetCluster() , session.GateServerID, session.SessionID, (int)CSGameMsgID.Ping, ref ping); } SSAddServerTimeSync sync = new SSAddServerTimeSync(); sync.Offset = nowOffset; //同步给world GameServerUtils.GetPacketSender().SendToWorldServer((int)SSGameMsgID.AddServerTimeSync, ref sync, 0); //同步给Rank GameServerUtils.GetPacketSender().SendToRankServer((int)SSGameMsgID.AddServerTimeSync, ref sync, 0); //同步Battle GameServerUtils.GetPacketSender() .Broadcast((int)ServerType.Battle, (int)SSGameMsgID.AddServerTimeSync, ref sync, 0, 0); //同步GameDB GameServerUtils.GetPacketSender() .Broadcast((int)ServerType.GameDb, (int)SSGameMsgID.AddServerTimeSync, ref sync, 0, 0); //同步Mail GameServerUtils.GetPacketSender() .Broadcast((int)ServerType.Mail, (int)SSGameMsgID.AddServerTimeSync, ref sync, 0, 0); TraceLog.Debug("GmCmdSvc.AddServerTime now server offset {0}", nowOffset); return 0; } [GmApiMapping(desc: "清理服务器时间", group: GmGroup.SERVER)] public int CliAddServerTime(long userid, uint second) { if (GameServerUtils.GetServerConfig().permitCliAddServerTime != 1) { TraceLog.Error( "GmCmdSvc.CliAddServerTime this server can not exec AddServerTime, server config permitCliAddServerTime = {0}" , GameServerUtils.GetServerConfig().permitCliAddServerTime); return -1; } string[] cmdParams = { second + "" }; GmCommandMgr.Instance.HandlerGmCommand("AddServerTime", 0, cmdParams, true); TraceLog.Debug("GmCmdSvc.CliAddServerTime now server"); return 0; } [GmApiMapping(desc: "停服", group: GmGroup.SERVER, ignore: true)] public int StopServer(long userid, int minute) { StopServerSvc.StartStopServer(minute); TraceLog.Debug("GmCmdSvc.StopServer, server will stop after {0} minute", minute); return 0; } [GmApiMapping(desc: "添加道具", group: GmGroup.EQUIPMENT,help:"count 上线99999")] public int AddItem(long userid, string itemId, long count) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddGold can not find palyer by uid {0}", userid); return -2; } if (count == 0) { TraceLog.Error("GmCmdSvc.AddGold invalid addvalue param {0}", count); return -3; } UnifyOp bagOp = new UnifyOp(player, BillChangeItemReason.GmCmd); var ret = count > 0 ? bagOp.AddItem(itemId, count) : bagOp.CostItem(itemId, -count); CSErrCode iRet = bagOp.DoOp(true, true); if (ret != 0 || iRet != 0) { player.Error("GmCmdSvc.AddGold uid {0} bagOp.DoOp failed ret {1}", player.UserID, iRet); return -4; } player.Trace("GmCmdSvc.AddGold uid {0} addchip success add chip {1}", player.UserID, count); return 0; } [GmApiMapping(desc: "添加钻石", group: GmGroup.EQUIPMENT)] public int AddDiamond(long userid, int addValue) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddDiamond can not find palyer by uid {0}", userid); return -2; } if (addValue == 0) { TraceLog.Error("GmCmdSvc.AddDiamond invalid addvalue param {0}", addValue); return -3; } // gm扣钱超过背包时,直接为0 if (addValue < 0 && (-addValue) > player.GetDiamond()) { addValue = (int)player.GetDiamond(); addValue = -addValue; } //int reasonId = BillChangeItemReasonMap.Instance.GetReasonIntType(BillChangeItemReason.GmCmd, false); UnifyOp Op = new UnifyOp(player, BillChangeItemReason.GmCmd, "GMAddDiamond"); if (addValue > 0) { Op.AddDiamond(addValue, 10000000); } else { Op.CostDiamond(-addValue); } var ret = Op.DoOp(); if (ret != CSErrCode.None) { return -4; } player.Trace("GmCmdSvc.AddDiamond uid {0} add diamond success add diamond {1}", player.UserID, addValue); return 0; } [GmApiMapping(desc: "添加代金券", group: GmGroup.EQUIPMENT)] public int AddToken(long userid, int addValue) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddToken can not find palyer by uid {0}", userid); return -2; } if (addValue == 0) { TraceLog.Error("GmCmdSvc.AddToken invalid addvalue param {0}", addValue); return -3; } // gm扣钱超过背包时,直接为0 if (addValue < 0 && (-addValue) > player.GetDiamond()) { addValue = (int)player.GetDiamond(); addValue = -addValue; } var op = new UnifyOp(player, BillChangeItemReason.GmCmd, "GMAddAddToken"); if (addValue > 0) { op.AddItem(ItemId.Token,addValue); } else { op.CostItem(ItemId.Token,-addValue); } var ret = op.DoOp(); if (ret != CSErrCode.None) { return -4; } player.Trace("GmCmdSvc.AddToken uid {0} add token success add token {1}", player.UserID, addValue); return 0; } [GmApiMapping(desc: "FirebasePush", help: "服务器上传文件用", group: GmGroup.SERVER,ignore:true)] public int FirebasePush(long userid, string key, string value, string content) { SSGoogleFirebasePush data = new SSGoogleFirebasePush(); if (key != "no") { data.ParamKey.SetString(key); } if (value != "no") { data.ParamValue.SetString(value); } string addContent = ""; var st = content.Split(" "); for (int i = 2; i < st.Length; i++) { if (i != 0) { addContent += " "; } addContent += st[i]; } data.Content.SetString(addContent); //有uid表示对一个玩家发,否则表示全服发 if (userid > 0) { TraceLog.Debug("GmCmdSvc.FirebasePush with uid {0}, add it", userid); data.PushUids.Add(userid); } TraceLog.Debug("GmCmdSvc.FirebasePush content {0} uid {1}", data.Content, userid); GameServerUtils.GetPacketSender().SendToWorldServer((int)SSGameMsgID.GooglePushInfo, ref data, 0); return 0; } [GmApiMapping(desc: "PushReadFile", help: "服务器上传文件用", group: GmGroup.SERVER,ignore:true)] public int PushReadFile(long userid, string filename, string fullPath) { if (!File.Exists(fullPath)) { TraceLog.Error("GmCmdSvc.PushReadFile file {0} not exists", filename); return -1; } string[] allline = File.ReadAllLines(fullPath); if (allline.Length < 2) { TraceLog.Error("GmCmdSvc.PushReadFile file {0} need 2 line", filename); return -1; } List uids = new List(); if (userid > 0) { uids.Add(userid); } bool bAllUser = false; string firstline = allline[0]; int linepos = 0; if (firstline.Length >= 3 && firstline[0] == 'u' && firstline[1] == 'i' && firstline[2] == 'd') { linepos++; string[] uidsplit = firstline.Split('|'); for (int i = 1; i < uidsplit.Length; i++) { //支持所有玩家 if (uidsplit[i] == "all") { bAllUser = true; break; } long uidparse = 0; if (true == long.TryParse(uidsplit[i], out uidparse)) { if (uidparse > 0) { uids.Add(uidparse); } } } } string content = allline[linepos]; linepos++; SSGoogleFirebasePush data = new SSGoogleFirebasePush(); data.Content.SetString(content); //命令参数指定了uid表示对一个玩家发,其实没啥用 if (userid > 0) { TraceLog.Debug("GmCmdSvc.PushReadFile with uid {0}, add it", userid); data.PushUids.Add(userid); } if (bAllUser) { TraceLog.Debug("GmCmdSvc.PushReadFile send to all content {0}", content); } else { foreach (var uid in uids) { data.PushUids.Add(uid); } if (data.PushUids.Count == 0) { TraceLog.Error("GmCmdSvc.PushReadFile no uid , please add it"); return -1; } TraceLog.Debug("GmCmdSvc.PushReadFile send to uid count {0} content {1}", data.PushIds.Count, content); } TraceLog.Debug("GmCmdSvc.PushReadFile content {0} uid {1}", data.Content, userid); GameServerUtils.GetPacketSender().SendToWorldServer((int)SSGameMsgID.GooglePushInfo, ref data, 0); return 0; } [GmApiMapping(desc: "添加物品", group: GmGroup.EQUIPMENT,help:"type =1 道具,2=武器")] public int AddGoods(long userid, string itemid, int itemcount, int itemType = 1) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddItem can not find palyer by uid {0}", userid); return -1; } UnifyOp bagOp = new UnifyOp(player, BillChangeItemReason.GmCmd); if (itemcount > 0) { bagOp.AddGoods(itemType, itemid, itemcount); } else { bagOp.CostGoods(itemType, itemid, -itemcount); } CSErrCode iRet = bagOp.DoOp(true, true, true); if (iRet != 0) { player.Error("GmCmdSvc.AddItem uid {0} bagOp.DoOp failed ret {1}", player.UserID, iRet); return -1; } player.Trace("GmCmdSvc.AddItem uid {0} add item success add item {1} count {2}", player.UserID, itemid, itemcount); return 0; } [GmApiMapping(desc: "添加时装", group: GmGroup.EQUIPMENT,help:"RoleModel 表id")] public int AddEquipSkin(long uid,string id) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.AddEquipSkin can not find palyer by uid {0}", uid); return -1; } var bagOp = new UnifyOp(player, BillChangeItemReason.GmCmd); bagOp.AddGoods((int)GoodsType.EquipSkin, id, 1); CSErrCode iRet = bagOp.DoOp(sendGetItemMsg:true); if (iRet != 0) { player.Error("GmCmdSvc.AddItem uid {0} bagOp.DoOp failed ret {1}", player.UserID, iRet); return -1; } player.MakeDirty(); return 0; } [GmApiMapping(desc: "一键添加所有时装", group: GmGroup.EQUIPMENT,help:"RoleModel 表id")] public int AddAllEquipSkin(long uid) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.AddAllEquipSkin can not find palyer by uid {0}", uid); return -1; } var bagOp = new UnifyOp(player, BillChangeItemReason.GmCmd); foreach (var kv in RoleModelDescMgr.Instance.ItemTable) { bagOp.AddGoods((int)GoodsType.EquipSkin, kv.Value.InternalId, 1); } CSErrCode iRet = bagOp.DoOp(sendGetItemMsg:true); if (iRet != 0) { player.Error("GmCmdSvc.AddAllEquipSkin uid {0} bagOp.DoOp failed ret {1}", player.UserID, iRet); return -1; } player.MakeDirty(); return 0; } [GmApiMapping(desc: "一键添加所有道具", group: GmGroup.EQUIPMENT)] public int AddAllItem(long userid) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddAllItem can not find palyer by uid {0}", userid); return -1; } int itemcount = 99999; UnifyOp bagOp = new UnifyOp(player, BillChangeItemReason.GmCmd); foreach (var item in ItemDescMgr.Instance.ItemTable) { var desc = item.Value; var type = (int)GoodsType.Items; if(desc.type == ItemType.RandomItem) { itemcount = 1; } bagOp.AddGoods(type, desc.itemID, itemcount); } CSErrCode iRet = bagOp.DoOp(true,true,true); if (iRet != 0) { player.Error("GmCmdSvc.AddAllItem uid {0} bagOp.DoOp failed ret {1}", player.UserID, iRet); return -1; } return 0; } [GmApiMapping(desc: "添加头像框", group: GmGroup.ROLE)] public int AddIconFrame(long userid, int frameId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddIconFrame can not find palyer by uid {0}", userid); return -2; } if (frameId == 0) { TraceLog.Error("GmCmdSvc.AddIconFrame invalid itemid param {0}", frameId); return -3; } UnifyOp bagOp = new UnifyOp(player, BillChangeItemReason.GmCmd); CSErrCode iRet = bagOp.DoOp(true, true); if (iRet != 0) { player.Error("GmCmdSvc.AddIconFrame uid {0} bagOp.DoOp failed ret {1}", player.UserID, iRet); return -5; } player.Trace("GmCmdSvc.AddIconFrame uid {0} add item success add frameId {1}", player.UserID, frameId); return 0; } [GmApiMapping(desc: "更改名称", group: GmGroup.ROLE)] public int ChangeNick(long userid, string newNick) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.ChangeNick can not find palyer by uid {0}", userid); return -2; } int iRet = PlayerUtils.CheckRenameValid(newNick); if (iRet != 0) { player.Error("GmCmdSvc.ChangeNick uid {0} CheckRenameValid failed ret {1}", player.UserID, iRet); return -3; } player.RoleBase.Nick.SetString(newNick); player.MakeDirty(); player.Trace("GmCmdSvc.ChangeNick uid {0} success new nick {1}", player.UserID, newNick); return 0; } [GmApiMapping(desc: "设置每日统计", group: GmGroup.SERVER)] public int SetDailyStat(long userid, int statId, int statValue) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.SetDailyStat can not find palyer by uid {0}", userid); return -2; } if (statId <= 0 || statId > (int)CSRoleStatisticsID.MaxID) { TraceLog.Error("GmCmdSvc.SetDailyStat invalid statId param {0} max {1}", statId, (int)CSRoleStatisticsID.MaxID); return -5; } RoleStatChgOp statChgOp = new RoleStatChgOp(player); statChgOp.SetIDDaily(statId, statValue); //可以不通知 statChgOp.NotifyClient(); player.Trace("GmCmdSvc.SetDailyStat uid {0} success", player.UserID); return 0; } [GmApiMapping(desc: "设置历史总统计", group: GmGroup.SERVER)] public int SetTotalStat(long userid, int statId, int statValue) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.SetTotalStat can not find palyer by uid {0}", userid); return -2; } if (statId <= 0 || statId > (int)CSRoleStatisticsID.MaxID) { TraceLog.Error("GmCmdSvc.SetTotalStat invalid statId param {0} max {1}", statId, (int)CSRoleStatisticsID.MaxID); return -5; } RoleStatChgOp statChgOp = new RoleStatChgOp(player); statChgOp.SetIDTotal(statId, statValue); //可以不通知 statChgOp.NotifyClient(); player.Trace("GmCmdSvc.SetTotalStat uid {0} success", player.UserID); return 0; } [GmApiMapping(desc: "清理支付", group: GmGroup.PAYMENT)] public int ClearPay(long userid, int clearAll) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.ClearPay can not find player by uid {0}", userid); return -1; } if (clearAll == 1) { foreach (QuestEXDesc taskDesc in QuestEXDescMgr.Instance.ItemTable.Values) { //if (taskDesc.questType == (int)TaskType.Passcard) //{ // TaskEXSvc.DeleteTask(player, taskDesc.questId); //} } player.RoleData.PayData.Clear(); for (int i = 0; i < 7; i++) { player.RoleData.PayData.MaxPayMoneyLast7Days.Add(0); } player.RoleData.PayData.LastUpdateMaxPayMoneyTime = (int)GameServerUtils.GetTimeSecond(); } else { player.RoleData.PayData.PayItemRecord.Clear(); } PlayerNotify.NotifyPlayerPayDataChange(player); player.Debug("GmCmdSvc.ClearPay uid {0} clearAll {1} succ", player.UserID, clearAll); return 0; } [GmApiMapping(desc: "伪造支付", group: GmGroup.PAYMENT)] public int FakePay(long uid, int itemId) { return PayCommSvc.FakePay(uid, itemId); } [GmApiMapping(desc: "代币支付", group: GmGroup.PAYMENT)] public int TokenPay(long uid, int itemId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.PopPayTest uid {0} no player obj", uid); return 0; } StructPacket packet = new StructPacket(); packet.Header.Type = (int)CSGameMsgID.PayGoogleReq; StructMessageParser parser = new StructMessageParser(); packet.Parser = parser; ref var req = ref packet.GetMessage(); req.ItemID = itemId; req.Uid = player.UserID; PayHandler payHandler = GameServerUtils.GetPayHandler(); PlayerSession playerSession = GameServerUtils.GetPlayerTableOp().GetPlayerSession(player.SessionID); payHandler.ProcessPayGoogleReq(playerSession, packet, false); TraceLog.Trace("GmCmdSvc.PopPayTest uid {0}!", uid); return 0; } [GmApiMapping(desc: "封号", group: GmGroup.SERVER)] public int SetFreezeTime(long userId, int hour) { if (userId == 0) { TraceLog.Error("GmCmdSvc.SetFreezeTime invalid uid param {0}", userId); return -1; } long freezeEndTime = GameServerUtils.GetTimeSecond() + hour * 3600; SSGMSetFreezeTime req = new SSGMSetFreezeTime(); req.FreezeTime = freezeEndTime; req.Uid = userId; req.OpSource.SetString("gm"); GameServerUtils.GetPacketSender().SendToWorldServer((int)SSGameMsgID.GmSetFreezeTime, ref req, req.Uid); GameBillLogUtils.LogFreezePlayer(req.Uid, hour); return 0; } [GmApiMapping(desc: "添加玩家等级", group: GmGroup.ROLE)] public int AddLevel(long userid, int level) { var player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddLevel uid {0} not in table", userid); return -1; } player.AddLevel(level); TraceLog.TraceDetail("GmCmdSvc.AddLevel day param player:{0} cm:{1}", player.UserID, level); return 0; } [GmApiMapping(desc: "添加支付道具", group: GmGroup.PAYMENT)] public int AddPayItem(long userid, int payItemId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddPayItem can not find player by uid {0}", userid); return -1; } PlayerSession playerSession = GameServerUtils.GetPlayerTableOp().GetPlayerSession(player.SessionID); if (playerSession == null) { TraceLog.Error("GmCmdSvc.AddPayItem can not find PlayerSession by uid {0}, session id {1}", userid, player.SessionID); return -1; } var desc = PayDiamondDescMgr.Instance.GetConfig(payItemId); if (desc == null) { TraceLog.Error("GmCmdSvc.AddPayItem invalid itemId {0}", payItemId); return -1; } var notify = new CSPayNewItemNotify(); notify.ItemID = desc.itemID; int index = PlayerPayUtil.GetPaySuccessRecordIndex(player, desc.itemID); if (index == -1) { PlayerPayUtil.AddPaySuccRecordIfNotExist(player, desc); var res = new CSPayGoogleSuccessRes(); GameServerUtils.GetEventHandlerMgr().TriggerPlayerPaySuccess(player, desc.itemID, 0, 0, 0, false, 0, ref res); } else { ref var record = ref PlayerPayUtil.GetPayItemRecordByIndex(player, index); } // 每次gm指令都发消息通知, 方便客户端测试 PlayerNotify.NotifyPlayerPayDataChange(player); player.SendToClient((int)CSGameMsgID.PayNewItemNotify, ref notify); return 0; } private static void GMTestHeroPaySucc(PlayerOnGame player, string orderId, int payType) { // uid - time - orderSeq - serverId - itemId - param1 - param2 var arr = orderId.Split('-'); var desc = PayDiamondDescMgr.Instance.GetConfig(int.Parse(arr[4])); if (desc == null) { TraceLog.Error("GmCmdSvc.GMTestHeroPaySucc invalid itemId {0}", arr[4]); return; } SSGMTestHeroPaySucc req = new SSGMTestHeroPaySucc(); req.Uid = player.UserID; req.ItemID = int.Parse(arr[4]); req.OrderId.SetString(orderId); req.OrderId3rd.SetString("gm_test_" + GameServerUtils.GetTimeMs()); req.MoneyUSD = (int)desc.currencyRes * 100; req.PayTime = GameServerUtils.GetTimeSecond(); req.PayType = payType; if (arr.Length >= 7) { int.TryParse(arr[5], out req.PayParam1); int.TryParse(arr[6], out req.PayParam2); } GameServerUtils.GetPacketSender() .SendToWorldServer((int)SSGameMsgID.GmTestHeroPaySucc, ref req, player.UserID); } public static void OnGmTestPayReqSuccess(PlayerOnGame player, ref SSPayGoogleRes res) { PlayerSession playerSession = GameServerUtils.GetPlayerTableOp().GetPlayerSession(player.SessionID); if (playerSession == null) { TraceLog.Error("GmCmdSvc.OnGmTestPayReqSuccess can not find PlayerSession by uid {0}, session id {1}" , player.UserID, player.SessionID); return; } string orderId = res.OrderId.GetString(); // 英雄支付 if (PlayerPayUtil.GetPlayerPayType(player) == PayType.Hero || PlayerPayUtil.GetPlayerPayType(player) == PayType.MiniPay) { GMTestHeroPaySucc(player, orderId, (int)PlayerPayUtil.GetPlayerPayType(player)); return; } PayHandler payHandler = GameServerUtils.GetPayHandler(); StructPacket packet = new StructPacket(); packet.Header.Type = (int)CSGameMsgID.PayGoogleSuccessReq; StructMessageParser parser = new StructMessageParser(); packet.Parser = parser; ref CSPayGoogleSuccessReq req = ref parser.GetMessage(); req.Uid = player.UserID; req.Signature.SetString("no signature"); req.OrderId.SetString(orderId); JsonData purchaseData = new JsonData(); //google的字段,ios反正加密了,gm测试的时候不需要 purchaseData["developerPayload"] = orderId; purchaseData["orderId"] = "testOrder3rd-" + GameServerUtils.GetTimeMs().ToString(); req.PurchaseData.SetString(purchaseData.ToJson()); payHandler.ProcessPayGoogleSuccessReq(playerSession, packet, true); } [GmApiMapping("服务器卡10秒",group: GmGroup.SERVER,ignore:true)] public int TestDeadLoop(long userid) { long tMs = AppTime.GetNowSysMs(); //卡10秒 for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1000); } return 0; } //如果是需要广播的,通知下world进行广播 private void NotifyWorldBroadCastGMCmdToServer(long userId, string gmCmd, string cmdParams) { SSNotifyWorldBroadCastGMCmd notify = new SSNotifyWorldBroadCastGMCmd(); notify.UserId = userId; notify.GmCmd.SetString(gmCmd); notify.CmdParams.SetString(cmdParams); notify.OnlyBroadCastSpec = userId > 0; //如果到了这里,userId又大于0 则是需要指定广播了 GameServerUtils.GetPacketSender() .SendToWorldServer((int)SSGameMsgID.NotifyworldBroadcastgmcmd, ref notify, 0, 0); } [GmApiMapping("测试广播一条信息到网关", group: GmGroup.SERVER,ignore:true)] public int TestBroadcastGate(long userid) { CSChatRes res = new CSChatRes(); res.Message.SetString("broadcast message"); uint gateServerID = ServerIDUtils.GetLevel1ServerIDByType(GameServerUtils.GetAppID(), (int)ServerType.GameGate, 1); List sessionIDList = new List(); foreach (var playersession in GameServerUtils.GetPlayerTable().m_sessionsTable) { if (playersession.Value.Player != null) { sessionIDList.Add(playersession.Key); //测试一下而已 if (sessionIDList.Count > 100) { break; } } } Sog.Gate.GateService.BroadcastToGate(0 , GameServerUtils.GetApp().GetCluster() , gateServerID , sessionIDList , (int)CSGameMsgID.ChatRes , ref res); return 0; } [GmApiMapping("添加一个装备", group: GmGroup.EQUIPMENT)] public int AddEquipment(long userid, string equipmentId) { StructPacket packet = new StructPacket(); MessageData messageData = new MessageData(); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddEquipment can not find palyer by uid {0}", userid); return -2; } UnifyOp op = new UnifyOp(player, BillChangeItemReason.GmCmd); op.AddGoods((int)GoodsType.Equipment, equipmentId, 1); op.DoOp(); return 0; } [GmApiMapping("一键添加红武器", group: GmGroup.EQUIPMENT)] public int AddRedEquipment(long userid, int level) { StructPacket packet = new StructPacket(); MessageData messageData = new MessageData(); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddEquipment can not find palyer by uid {0}", userid); return -2; } UnifyOp op = new UnifyOp(player, BillChangeItemReason.GmCmd); foreach (var item in GmDescMgr.Instance.ItemTable.Values) { if(item.type.Equals("1")) { var slv = string.Format("{0:D3}", level); string equipId = item.gmweapon1 + "" + slv + item.gmweapon2; op.AddGoods((int)GoodsType.Equipment, equipId, 1); } } op.DoOp(true, true, true); return 0; } [GmApiMapping("一键添加非红武器", group: GmGroup.EQUIPMENT, help: "品质 1 白 2蓝 3紫 4金 5彩")] public int AddNoneRedEquipment(long userid, int quality, int level) { StructPacket packet = new StructPacket(); MessageData messageData = new MessageData(); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddEquipment can not find palyer by uid {0}", userid); return -2; } UnifyOp op = new UnifyOp(player, BillChangeItemReason.GmCmd); foreach (var item in GmDescMgr.Instance.ItemTable.Values) { if (item.type.Equals("2")) { string equipId = item.gmweapon1 + "_" + (quality * 1000 + level) + item.gmweapon2; op.AddGoods((int)GoodsType.Equipment, equipId, 1); } } op.DoOp(true, true, true); return 0; } [GmApiMapping("一键添防具", group: GmGroup.EQUIPMENT, help: "品质 1 白 2蓝 3紫 4金 5彩")] public int AddDefEquipment(long userid, int quality, int level) { StructPacket packet = new StructPacket(); MessageData messageData = new MessageData(); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.AddEquipment can not find palyer by uid {0}", userid); return -2; } var list = new List(); foreach (var item in GmDescMgr.Instance.ItemTable.Values) { if (item.type.Equals("3")) { string equipId = item.gmweapon1 + "" + (quality * 1000 + level) + item.gmweapon2; var equipDesc=EquipDescMgr.Instance.GetConfig(equipId); if (equipDesc == null) { continue; } if (list.Count >= 49) { Send(player, list); list.Clear(); } list.Add(equipId); } } Send(player, list); return 0; } private static void Send(PlayerOnGame player,ListequipList) { UnifyOp op = new UnifyOp(player, BillChangeItemReason.GmCmd); foreach (var equipId in equipList) { op.AddGoods((int)GoodsType.Equipment, equipId, 1); } op.DoOp(true, true, true); } [GmApiMapping(desc: "压缩数据", group: GmGroup.SERVER,ignore:true)] public int ZipRole(long userid) { PlayerDataSvc.testZipRole = 1; return 0; } [GmApiMapping(desc: "踢出玩家下线", help: "1:踢出账号,2:踢出游戏", group: GmGroup.SERVER)] public int KickOutAllPlayer(long userid, int type) { var allplayer = GameServerUtils.GetPlayerTableOp(); CSLoginRes loginResCS = new CSLoginRes(); loginResCS.Ret = (int)CSErrCode.InvalidAccount; loginResCS.ServerTime = GameServerUtils.GetTimeMs(); loginResCS.Uid = 0; loginResCS.LoginToken = 0; loginResCS.TimeZone = AppTime.TimeZone; foreach (var player in allplayer.Table.m_uidTable) { PlayerSession session = GameServerUtils.GetPlayerTableOp().GetPlayerSession(player.Value.SessionID); if (session != null) { switch (type) { case 1: //踢出账号 GateService.SendToGate(session.UserID, GameServerUtils.GetApp().GetCluster(), session.GateServerID, session.SessionID, (int)CSGameMsgID.LoginRes, ref loginResCS); break; case 2: //踢出游戏 loginResCS.Ret = (int)CSErrCode.ResetGame; GateService.SendToGate(session.UserID, GameServerUtils.GetApp().GetCluster(), session.GateServerID, session.SessionID, (int)CSGameMsgID.LoginRes, ref loginResCS); break; } //其它的断开链接重连 GateService.NotifyGateServerDisconnect(GameServerUtils.GetApp(), session.GateServerID, session.SessionID); } } return 0; } [GmApiMapping(desc: "获取在线玩家数量", group: GmGroup.SERVER)] public int GetOnlinePlayer(long userid) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.GetOnlinePlayer can not find palyer by uid {0}", userid); return -1; } CSGmGetOnlinePlayerNotify res = new CSGmGetOnlinePlayerNotify(); res.OnlinePlayer = GameServerUtils.GetPlayerTableOp().GetOnlinePlayer(); player.SendToClient((int)CSGameMsgID.GmGetOnlineplayerNotify, ref res); return 0; } [GmApiMapping("生成机器人数据", group: GmGroup.SERVER)] public int GenRobot(long userid) { ref SimpleRobotPool robotPool = ref GmStaticData.robotPool; ref SimpleRobotList robotList = ref GmStaticData.robotList; robotPool.Clear(); var robot = new SimpleRobot(); int count = 0; for (int i = 1; i <= 120; i++) { robotList.Clear(); for (int j = 0; j < 50; j++) { robot.Clear(); ProcessGenRobot(i, 1000 + count, ref robot); robotList.List.Add(ref robot); count++; } robotPool.Pool.Add(ref robotList); } TraceLog.Debug("GmCmdSvc.GenRobot count {0}", count); FileDBSave.SaveToFile(ref robotPool, "../cfg/data/robot.bin"); return 0; } [GmApiMapping("生成单个机器人", group: GmGroup.SERVER)] public int GenSingleRobot(long userid, int level, int uid) { var robot = new SimpleRobot(); ProcessGenRobot(level, uid, ref robot); // todo 存入文件或是替代内存 FileDBSave.SaveToFile(ref robot, "../cfg/data/singleRobot.bin"); return 0; } private static string GetRobotLastNameByIdx(int idx) { string name = ""; var desc = RandNameDescMgr.Instance.GetConfig(idx); if (desc != null) { int randNameRow = 0; string strRandNameRow = GameServerUtils.GetApp().GetCluster().GetAppParamByKey("randNameRow"); //读第几列,从0开始 if (!string.IsNullOrEmpty(strRandNameRow)) { int.TryParse(strRandNameRow, out randNameRow); } if (randNameRow + 1 <= desc.name.Length) { if (!string.IsNullOrEmpty(desc.name[randNameRow].LastName)) { name = desc.name[randNameRow].LastName; } } } return name; } private static void ProcessGenRobot(int level, int uid, ref SimpleRobot robot) { int baseRate = 0; int nameIdx = uid % RandNameDescMgr.Instance.ItemTable.Count + 1; long nowSec = GameServerUtils.GetTimeSecond(); var noneEquip = new DBEquipment(); var hero = new HeroInfo(); var roleBase = new DBRoleBase(); // RoleBase roleBase.Uid = uid; roleBase.Nick.SetString(GetRobotLastNameByIdx(nameIdx)); roleBase.Gender = 0; roleBase.Icon.SetString(IconUtils.GetRandFreeIcon()); roleBase.Exp = 0; roleBase.Level = level; roleBase.VipLevel = 0; roleBase.Chip = 0; roleBase.Diamond = 0; roleBase.LastLoginTime = GameServerUtils.GetTimeSecond(); roleBase.CreateTime = GameServerUtils.GetTimeSecond(); roleBase.OnlineTime = GameServerUtils.GetTimeSecond(); roleBase.VipExp = 0; roleBase.HeroExpPool = 0; roleBase.RoleCreateComplete = 0; roleBase.Power = 0; // DBHero hero.Dbhero.Level = level; hero.Dbhero.DescId = 100; for (int j = 0; j < hero.Dbhero.WearEquip.GetMaxCount(); j++) { hero.Dbhero.WearEquip.Add(ref noneEquip); } int wearNum = 0; var equip = new DBEquipment(); int chestLv = Math.Max(hero.Dbhero.Level / 10, 3); while (wearNum < hero.Dbhero.WearEquip.GetMaxCount()) { //EquipmentSvc.CreateEquip(level, chestLv, ref equip); //// 没有装备 //int idx = equip.Pos - 1; //if (idx == -1) //{ // continue; //} //if (hero.Dbhero.WearEquip[idx].Pos == 0) //{ // hero.Dbhero.WearEquip[idx] = equip; // wearNum += 1; //} equip.Pos = ++wearNum; hero.Dbhero.WearEquip.Add(ref equip); } //hero.LineupPos = 1; // 生成属性并填充对应字段 //var heroProp = new RoleProp(); //RolePropUtil.RecalRoleProp(player, heroProp); //heroProp.BeginChange(); //heroProp.SetValueNoCheck(CSPropIDType.HpMax, heroProp.GetValueNoCheck(CSPropIDType.HpMax) * baseRate / 10000); //heroProp.SetValueNoCheck(CSPropIDType.Atk, heroProp.GetValueNoCheck(CSPropIDType.Atk) * baseRate / 10000); //heroProp.SetValueNoCheck(CSPropIDType.Def, heroProp.GetValueNoCheck(CSPropIDType.Def) * baseRate / 10000); //heroProp.SetValueNoCheck(CSPropIDType.Speed, heroProp.GetValueNoCheck(CSPropIDType.Speed) * baseRate / 10000); //heroProp.EndChange(); //HeroPropUtils.FillHeroInfoProp(ref hero, heroProp); //robot.HeroInfo.CopyFrom(ref hero); //robot.RoleBase.CopyFrom(ref roleBase); //robot.RandNameIdx = nameIdx; TraceLog.Debug("GmCmdSvc.ProcessGenRobot uid {0} icon {1} roleBase.level {2} heroInfo.level {3} nameIdx {4}" , uid, roleBase.Icon, robot.RoleBase.Level, robot.HeroInfo.Dbhero.Level, robot.RandNameIdx); } /// /// 查询其他玩家测试接口 /// /// /// /// public int GetOtherInfo(long userid, long targetUid = 100002) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.GetOtherInfo invalid uid {0}", userid); return -1; } CSPlayerQueryOtherRoleInfoReq req = new CSPlayerQueryOtherRoleInfoReq(); req.QueryRoleType = QueryRoleType.None; req.TargetUid = targetUid; PlayerOnGame target = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(req.TargetUid); if (target == null) { //直接给world就好了 GameServerUtils.GetPacketSender() .SendToWorldServer((int)CSGameMsgID.PlayerQueryOtherRoleInfoReq, ref req, userid); } else { //CSPlayerQueryOtherRoleInfoRes queryRes = new CSPlayerQueryOtherRoleInfoRes(); //queryRes.FromUid = player.UserID; //queryRes.Ret = CSErrCode.None; //HeroPropUtils.FillHeroInfo(ref queryRes.ShowInfo.HeroInfo, ref target.RoleData, target.knight.prop); //PlayerUtils.GetRoleBaseInfo(target, ref queryRes.ShowInfo.RoleBaseInfo); //player.SendToClient((int)CSGameMsgID.PlayerQueryOtherRoleInfoRes, ref queryRes); } return 0; } [GmApiMapping(desc: "清理广告数据", group: GmGroup.SERVER)] public int ClearAd(long userid) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(userid); if (player == null) { TraceLog.Error("GmCmdSvc.ClearAd invalid uid {0}", userid); return -1; } HomeAdEvent.OnNewDay(player, true); player.MakeDirty(); return 0; } [GmApiMapping("清理支付记录", group: GmGroup.PAYMENT)] public int ClearPayRecord(long uid, int itemId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.RecalcWingProp uid {0} no player obj", uid); return 0; } for (int i = player.RoleData.PayData.PayItemRecord.Count - 1; i >= 0; i--) { ref var record = ref player.RoleData.PayData.PayItemRecord[i]; if (record.ItemId == itemId) { player.RoleData.PayData.PayItemRecord.RemoveAt(i); player.MakeDirty(); break; } } return 0; } [GmApiMapping(desc: "添加奖励", group: GmGroup.EQUIPMENT)] public int AddReward(long uid, string rewardId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.AddReward uid {0} no player obj", uid); return 0; } var res = RewardSvc.Reward(player, rewardId); res.ForEach(r => { TraceLog.Trace("rewardres {0}", r); }); return 0; } [GmApiMapping(desc: "速通关卡", group: GmGroup.CHAPTER,help:"chapter表里面的id和chapterbattle表id")] public int OnSkipChapter(long uid, int chapterId, int battleId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.OnSkipChapter uid {0} no player obj", uid); return 0; } if (player.RoleData.IsInBattle) { TraceLog.Error("GmCmdSvc.OnSkipChapter player in battle .can not skip ", uid); return -1; } var desc = ChapterDescMgr.Instance.GetConfig(chapterId); if (desc == null) { return -1; } var battleDesc = ChapterBattleDescMgr.Instance.GetConfig(battleId); if (battleDesc == null) { return -1; } var targetId = desc.firstChapterBattleId; var vaild = targetId == battleId; while (targetId != 0) { var _battleDesc = ChapterBattleDescMgr.Instance.GetConfig(targetId); if (_battleDesc == null || _battleDesc.nextChapterBattleId == 0) { break; } targetId = _battleDesc.nextChapterBattleId; if (targetId == battleId) { vaild = true; break; } } if (!vaild) { return -1; } var minChapterId = CommParamDescMgr.Instance.MainLandFirstId.int_val; while (minChapterId <= chapterId) { var chapterDesc = ChapterDescMgr.Instance.GetConfig(minChapterId); minChapterId = chapterDesc.nextChapterId; var firstChapterBattleId = chapterDesc.firstChapterBattleId; while (firstChapterBattleId != 0) { var chapterBattleDesc = ChapterBattleDescMgr.Instance.GetConfig(firstChapterBattleId); firstChapterBattleId = chapterBattleDesc.nextChapterBattleId; var stageId = chapterBattleDesc.firstChapterBattleStageId; while (stageId != 0) { var stageDesc = ChapterBattleStageDescMgr.Instance.GetConfig(stageId); stageId = stageDesc.nextStageId; ChapterHelper.SetEffectiveStage(player, stageDesc.stageIndex); if (stageId == 0) { break; } } ChapterHelper.SetPerfectPass(player,chapterBattleDesc.chapterIndex); if (firstChapterBattleId > battleId) { break; } if (firstChapterBattleId == 0) { break; } } if (minChapterId == 0) { break; } } player.RoleData.ChapterData.ChapterId = chapterId; player.RoleData.ChapterData.BattleId = battleId; RankSvc.UpdateRankScore(player, 1, battleId, 10); ChapterSvc.SyncChapterInfo(player); player.MakeDirty(); return 0; } [GmApiMapping(desc: "进入指定关卡", group: GmGroup.CHAPTER)] public static int OnEnterChapter(long uid, int chapterId, int battleId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.OnSkipChapter uid {0} no player obj", uid); return 0; } // if (player.RoleData.IsInBattle) // { // TraceLog.Error("GmCmdSvc.OnSkipChapter player in battle .can not skip ", uid); // return -1; // } // if (chapterId > player.RoleData.ChapterData.ChapterId) // { // player.RoleData.ChapterData.ChapterId = chapterId; // } // // if (battleId > player.RoleData.ChapterData.BattleId) // { // player.RoleData.ChapterData.BattleId = battleId; // } var packet = new StructPacket(); packet.Header.Type = (int)CSGameMsgID.BattleBeginReq; var parser = new StructMessageParser(); packet.Parser = parser; ref var req = ref packet.GetMessage(); req.ChapterId = chapterId; req.BattleId = battleId; req.IsGm = false; ChapterSvc.OnBattleBegin(player,packet); return 0; } [GmApiMapping(desc: "奖励关出来", group: GmGroup.CHAPTER,help:"ChapterBattle表里面的id")] public static int InitRewardChapter(long uid,int battleId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.OnSkipChapter uid {0} no player obj", uid); return 0; } var desc = ChapterBattleDescMgr.Instance.GetConfig(battleId); if (desc == null || desc.chapterBattleType != ChapterBattleType.RewardBattle) { return 0; } player.RoleData.ChapterData.RewardBattleData.BattleId = battleId; var duration = CommParamDescMgr.Instance.RwdChapterTime.int_val; player.RoleData.ChapterData.RewardBattleData.LoseTime = GameServerUtils.GetTimeSecond() + duration; ChapterSvc.SyncChapterInfo(player); player.MakeDirty(); return 0; } [GmApiMapping(desc: "排行榜", group: GmGroup.SERVER, help: "")] public int RankOper(long uid, int rankId, int score) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.AddReward uid {0} no player obj", uid); return 0; } RankSvc.UpdateRankScore(player, rankId, score, 0, false); return 0; } [GmApiMapping(desc: "激活月卡", group: GmGroup.PAYMENT, help: "cardid 月卡表里面的id")] public int ActiveMonthlyCard(long uid, int cardId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } var desc = MonthlyCardDescMgr.Instance.GetConfig(cardId); MonthlyCardSvc.OnActiveMonthlyCard(player,desc.id); return 0; } [GmApiMapping(desc: "添加BP点数", group: GmGroup.PAYMENT, help: "activity 表 id")] public int BattleAddPoint(long uid, int actId,int count) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } if (ActivitySvc.GetActivityState(player, actId) != ActivityState.InProgress) { return 0; } ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData; var index = -1; for (int i = 0; i < battlePassData.Count; i++) { ref var battlePass = ref battlePassData[i]; if (battlePass.ActId == actId) { index = i; break; } } if (index < 0) { return -1; } battlePassData[index].Point += count; player.MakeDirty(); BattlePassSvc.SyncBattlesInfo(player); return 0; } [GmApiMapping(desc: "抽卡", group: GmGroup.PAYMENT, help: "Gacha表id ,抽卡数量")] public int Recruit(long uid, string poolId, int num) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } var desc = GachaDescMgr.Instance.GetConfig(poolId); var unifyOp = new UnifyOp(player, BillChangeItemReason.RecruitAdv); var result = new List(); for (int i = 0; i < num; i++) { RecruitSvc.RecruitOne(player,unifyOp,desc.InternalId,result); } unifyOp.DoOp(sendGetItemMsg: true); return 0; } [GmApiMapping(desc: "战斗所有章节", group: GmGroup.BATCHTEST, ignore: true)] public int TestImport(long uid, int chapterId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } var item = ChapterDescMgr.Instance.GetConfig(chapterId); var battleId = item.firstChapterBattleId; while (battleId != 0) { var desc = ChapterBattleDescMgr.Instance.GetConfig(battleId); ChapterTest.TestImport(player, chapterId, battleId); battleId = desc.nextChapterBattleId; } return 0; } [GmApiMapping(desc: "添加所有宝石", group: GmGroup.EQUIPMENT, help: "count")] public int AddAllGem(long uid, int count ) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } UnifyOp op = new UnifyOp(player, "GM"); var items = GemDescMgr.Instance.ItemTable.Values; for (int i = 0; i < items.Count; i++) { op.AddGoods((int)GoodsType.Gem, items[i].id, count); if(i % 60 == 0) { op.DoOp(true, true, true); } } op.DoOp(true, true, true); return 0; } [GmApiMapping(desc: "添加宝石", group: GmGroup.EQUIPMENT, help: "头1护甲2首套3护腿4鞋5配件6饰品7芯片8万能10 白1蓝2紫3金4深金5红6")] public int AddGem(long uid, int count, int pos, int quality) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } UnifyOp op = new UnifyOp(player, "GM"); var items = GemDescMgr.Instance.ItemTable.Values; for (int i = 0; i < items.Count; i++) { var c = items[i]; if ((int)c.position == pos && (int)c.quality == quality) { op.AddGoods((int)GoodsType.Gem, items[i].id, count); if (i % 60 == 0) { op.DoOp(true, true, true); } } } op.DoOp(true, true, true); return 0; } [GmApiMapping(desc: "跳过所有引导", group: GmGroup.BEGINNER)] public int FinishAllGuide(long uid) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } var newVal = new RepeatedInt_64(); foreach (var desc in NoviceGuidanceDescMgr.Instance.ItemTable.Values) { newVal.Add(desc.id); } player.RoleData.BeginnerGuide = newVal; var res = new CSBeginnerGuideChangeRes(); res.BeginnerGuide.CopyFrom(ref player.RoleData.BeginnerGuide); player.SendToClient((int)CSGameMsgID.BeginnerGuideChangeRes, ref res); player.MakeDirty(); return 0; } [GmApiMapping(desc: "解锁所有系统", group: GmGroup.BEGINNER)] public int UnLockAllSystem(long uid) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.UnLockAll uid {0} no player obj", uid); return 0; } var tempList = new List(); foreach (var c in UnlockSystemDescMgr.Instance.ItemTable.Values) { bool unlock = false; for(int i = 0; i < player.RoleData.SysUnlockData.SysUnlockDataOne.Count; i++) { if (player.RoleData.SysUnlockData.SysUnlockDataOne[i].SysID == c.id) { unlock = true; break; } } if(!unlock) { DBSysUnlockDataOne unlockData = new DBSysUnlockDataOne(); unlockData.SysID = c.id; unlockData.SysUnlockTime = GameServerUtils.GetTimeSecond(); player.RoleData.SysUnlockData.SysUnlockDataOne.Add(unlockData); GameServerUtils.GetEventHandlerMgr().TriggerSystemUnlock(player, c.id); tempList.Add(c.id); } } player.MakeDirty(); if (tempList.Count > 0) { SystemUnlockEvent.SendSyn(tempList, player); } return 0; } [GmApiMapping(desc: "作战手册任务全完成", group: GmGroup.ACTIVITY)] public int DoneAllSignTasks(long uid,int actId) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } if (actId == 0) { return 0; } var desc = ActivityDescMgr.Instance.GetConfig(actId); if (desc is not { type: ActivityType.HandBook }) { return 0; } HandBookAct.DoneAllTask(player,actId); return 0; } [GmApiMapping(desc: "血厚和暴击", group: GmGroup.CHAPTER)] public int RoleFight(long uid) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } player.RoleData.GmProp.Clear(); player.RoleData.GmProp.Add(new IDValue64(){Id =(int)PropertyDef.HpPercentIncrease,Value = 10000*10000 }); player.RoleData.GmProp.Add(new IDValue64(){Id =(int)PropertyDef.CriticalRate,Value = 100_0000 }); RolePropUtil.RecalRoleProp(player, true); player.MakeDirty(); return 0; } [GmApiMapping(desc: "我无敌", group: GmGroup.CHAPTER,help:"0:无敌,1:清理无敌")] public int OverKiller(long uid, int clear = 0) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.OverKiller uid {0} no player obj", uid); return 0; } if (clear == 1) { player.RoleData.GmProp.Clear(); RolePropUtil.RecalRoleProp(player, true); player.MakeDirty(); return 0; } player.RoleData.GmProp.Clear(); player.RoleData.GmProp.Add(new IDValue64(){Id =(int)PropertyDef.HpPercentIncrease,Value = 10000_00 }); player.RoleData.GmProp.Add(new IDValue64(){Id =(int)PropertyDef.DamageRate,Value = 100_00 }); player.RoleData.GmProp.Add(new IDValue64(){Id =(int)PropertyDef.CriticalRate,Value = 100_000 }); player.RoleData.GmProp.Add(new IDValue64(){Id =(int)PropertyDef.AtkFixedIncrease,Value = 30000_0000 }); player.RoleData.GmProp.Add(new IDValue64(){Id =(int)PropertyDef.PhyDamage,Value = 10000_000 }); player.RoleData.GmProp.Add(new IDValue64(){Id =(int)PropertyDef.DamageResistance,Value = 10000_000 }); RolePropUtil.RecalRoleProp(player, true); player.MakeDirty(); return 0; } [GmApiMapping(desc: "功能全部解锁", group: GmGroup.BEGINNER)] public int UnlockAll(long uid) { PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.ActiveMonthlyCard uid {0} no player obj", uid); return 0; } List tempList = new List(); foreach (var c in UnlockSystemDescMgr.Instance.ItemTable.Values) { bool unlock = false; for (int i = 0; i < player.RoleData.SysUnlockData.SysUnlockDataOne.Count; i++) { if (player.RoleData.SysUnlockData.SysUnlockDataOne[i].SysID == c.id) { unlock = true; break; } } if (!unlock) { DBSysUnlockDataOne unlockData = new DBSysUnlockDataOne(); unlockData.SysID = c.id; unlockData.SysUnlockTime = GameServerUtils.GetTimeSecond(); player.RoleData.SysUnlockData.SysUnlockDataOne.Add(unlockData); tempList.Add(c.id); GameServerUtils.GetEventHandlerMgr().TriggerSystemUnlock(player, c.id); } } if (tempList.Count > 0 ) { SystemUnlockEvent.SendSyn(tempList, player); } return 0; } public static void CollectGmProp(ref DBRoleData roleDat, RoleProp roleProp) { for (int i = 0; i < roleDat.GmProp.Count; i++) { roleProp.AddProp((int)roleDat.GmProp[i].Id, roleDat.GmProp[i].Value); } } [GmApiMapping(desc: "翅膀一键满级", group: GmGroup.ROLE)] public int WingMax(long uid) { var player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.WingMax uid {0} no player obj", uid); return 0; } ref var wingData = ref player.RoleData.WingData; wingData.Wing.LevelId = WingsLevelDescMgr.Instance.ItemTable.Values.Last().id; wingData.Wing.RankId = WingsRankDescMgr.Instance.ItemTable.Values.Last().id; wingData.Wing.StarId = WingsStarDescMgr.Instance.ItemTable.Values.Last().id; wingData.Wing.WearId = WingsStarDescMgr.Instance.ItemTable.Values.Last().id; WingSvc.RecWinsProp(player); WingSvc.SyncData(player); return 0; } [GmApiMapping(desc: "解锁天赋", group: GmGroup.TALENT, help: "0 普通天赋,1巅峰天赋")] public int ActiveTalent(long uid, int page) { var player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.WinMainOption uid {0} no player obj", uid); return 0; } var packet = new StructPacket(); packet.Header.Type = (int)CSGameMsgID.TalentOptionsReq; var parser = new StructMessageParser(); packet.Parser = parser; ref var req = ref packet.GetMessage(); req.PageIndex = page; TalentSvc.OnTalentOption(player, packet); return 0; } [GmApiMapping(desc: "激活/回退天赋点", group: GmGroup.TALENT, help: "page:0 普通天赋,1巅峰天赋, talentId 天赋id, backup 0激活,1回退")] public int TalentOptaion(long uid,int page,int talentId, int backup) { var player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.WinMainOption uid {0} no player obj", uid); return 0; } var packet = new StructPacket(); packet.Header.Type = (int)CSGameMsgID.TalentOptionsReq; var parser = new StructMessageParser(); packet.Parser = parser; ref var req = ref packet.GetMessage(); req.TalentId = talentId; req.Backup = backup != 0; req.PageIndex = page; TalentSvc.OnActiveOption(player, packet); return 0; } [GmApiMapping(desc: "领取体力", group: GmGroup.ROLE, help: "all:0 领取一个,1 全部领取")] public int GainPower(long uid, int all) { var player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("GmCmdSvc.WinMainOption uid {0} no player obj", uid); return 0; } var packet = new StructPacket(); packet.Header.Type = (int)CSGameMsgID.TalentOptionsReq; var parser = new StructMessageParser(); packet.Parser = parser; ref var req = ref packet.GetMessage(); req.All = all == 1; PlayerDataSvc.GainPower(player,packet); return 0; } } }