/// <summary> /// Расчитывает стоимость инциндента, и изымает её. /// </summary> /// <param name="command">Текстовая команда для чата</param> /// <param name="onliCheck">Только рассчитать, не изымая.</param> /// <error>Ошибка, или результат при onliCheck</error> /// <returns>Строка с количество требуемой стоимости</returns> public static string GetCostOnGameByCommand(string command, bool onliCheck, out string error) { Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand 1 command:" + command); //разбираем аргументы в кавычках '. Удвоенная кавычка указывает на её символ. string cmd; List <string> args; ChatUtils.ParceCommand(command, out cmd, out args); if (args.Count < 3) { error = "OC_Incidents_OCIncident_WrongArg".Translate().ToString(); Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand error:" + error); return(null); } // /call raid '111' 1 10 air tribe //проверка, что денег хватает int cost = OCIncident.CalculateRaidCost(args[0].ToLower(), Int64.Parse(args[2]) , args.Count > 3 ? Int32.Parse(args[3]) : 1 , args.Count > 4 ? args[4].ToLower() : null , args.Count > 5 ? args[5].ToLower() : null); int gold = -1; Map map = null; if (cost > 0) { gold = GameUtils.FindThings(ThingDefOf.Gold, 0, false); } if (cost < 0 || gold < 0 || gold < cost) { error = cost < 0 || gold < 0 ? "OC_Incidents_OCIncident_WealthErr".Translate().ToString() + $" cost={cost} gold={gold}" : "OC_Incidents_OCIncident_GoldErr".Translate(gold, cost, cost - gold).ToString(); Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand error:" + error); return(null); } if (onliCheck) { error = null; return("OC_Incidents_OCIncident_NotEnoughGold".Translate(cost)); } Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand 2"); //отнимаем нужное кол-во денег(золото или серебро... или что-нибудь ещё) GameUtils.FindThings(ThingDefOf.Gold, cost, false); Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand 3"); //принудительное сохранение if (!SessionClientController.Data.BackgroundSaveGameOff) { SessionClientController.SaveGameNow(true); } Loger.Log("IncidentLod ChatController.AfterStartIncident 4"); error = null; return("OC_Incidents_OCIncident_GoldPay".Translate(cost)); }
public ModelStatus GetModelStatus(ModelPostingChat pc, ServiceContext context) { if (context.PossiblyIntruder) { context.Disconnect("Possibly intruder"); return(null); } var timeNow = DateTime.UtcNow; if (string.IsNullOrEmpty(pc.Message)) { return(new ModelStatus() { Status = 0, Message = null }); } var chat = context.Player.Chats.Keys.FirstOrDefault(ct => ct.Id == pc.IdChat); if (chat == null) { return(new ModelStatus() { Status = 1, Message = "Chat not available" }); } Grants acceptedGrants; PlayerServer player; // обработка команд чата if ("discord".Equals(context.Player.Public.Login.ToLower())) { player = Repository.GetPlayerByLogin(pc.Owner); if (player == null) { return(new ModelStatus() { Status = (int)ChatCmdResult.UserNotFound, Message = $"user {pc.Owner} not found", }); } acceptedGrants = context.Player.Public.Grants & player.Public.Grants; } else { player = context.Player; acceptedGrants = player.Public.Grants; } if (pc.Message[0] == '/') { //разбираем аргументы в кавычках '. Удвоенная кавычка указывает на её символ. string command; List <string> argsM; ChatUtils.ParceCommand(pc.Message, out command, out argsM); var result = ChatManager.TryGetCmdForUser(player.Public.Login, acceptedGrants, command, out IChatCmd cmd); if (result.Status > 0) { return(result); } // аdditionally check Grants for DiscordUser: some commands for example: create chat, get token doesn't permitted from discord return(cmd.Execute(ref player, chat, argsM)); } else { Loger.Log("Server post " + context.Player.Public.Login + ":" + pc.Message); var mmsg = pc.Message; if (mmsg.Length > 2048) { mmsg = mmsg.Substring(0, 2048); } chat.Posts.Add(new ChatPost() { Time = timeNow, Message = mmsg, OwnerLogin = player.Public.Login, DiscordIdMessage = pc.IdDiscordMsg, }); } return(new ModelStatus() { Status = 0, Message = null }); }