public void OnUpdate() { for (int i = 0; i < ArenaManager.Arenas.Count; i++) { var arena = ArenaManager.Arenas[i]; if (ParamContains(arena, "autochange")) { if (arena.NextChange < DateTime.Now) { string[] param = arena.Parameters.Find(s => s.StartsWith("autochange")).Split(':'); int nextVoteSec = int.Parse(param[1]); string tag = param[2]; var maps = MapManager.GetMapsByTag(tag); maps.RemoveAll(mp => mp.Size.X > arena.Size.X || mp.Size.Y > arena.Size.Y); maps.Remove(arena.Map); if (maps.Count > 0) { int id = new Random().Next() % maps.Count; ArenaManager.SetMap(arena, maps[id]); } arena.NextChange = DateTime.Now.AddSeconds(nextVoteSec); } } } for (int i = 0; i < Votings.Count; i++) { if (Votings[i].CheckEnd()) { var arena = Votings[i].Arena; var map = Votings[i].GetWinner(); string[] param = arena.Parameters.Find(s => s.StartsWith("vote")).Split(':'); ArenaManager.SetMap(arena, map); arena.NextChange = DateTime.Now; var nextVote = DateTime.Now.AddSeconds(int.Parse(param[2])); arena.NextChange = nextVote; ArenaManager.GetPlayersInArena(arena).ForEach(plr => plr.SendInfoMessage($"Next vote will be available in {GenerateTimeString(TimeSpan.FromSeconds(int.Parse(param[1])))}")); Votings.RemoveAt(i); } } }
private void ArenaCmd(CommandArgs args) { string subCmd = args.Parameters.Count == 0 ? "help" : args.Parameters[0]; switch (subCmd) { #region Define case "define": if (args.Parameters.Count < 3) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /arena define <name> <mapname> [align] [width] [height]"); return; } var arena = ArenaManager.GetArenaByName(args.Parameters[1]); if (arena != null) { args.Player.SendErrorMessage($"Arena {arena.Name} already exist!"); return; } var map = MapManager.GetMapByName(args.Parameters[2]); if (map == null) { args.Player.SendErrorMessage($"Map {args.Parameters[2]} does not exist!"); return; } string align; if (args.Parameters.Count > 3) { if (!CheckAlign(args.Player, args.Parameters[3].ToLower())) { return; } align = args.Parameters[3].ToLower(); } else { align = "c"; } var playerInfo = args.Player.GetPlayerInfo(); if (args.Parameters.Count == 6) { Point size; if (!int.TryParse(args.Parameters[4], out size.X)) { args.Player.SendErrorMessage($"Invalid width {args.Parameters[4]}"); return; } if (!int.TryParse(args.Parameters[5], out size.Y)) { args.Player.SendErrorMessage($"Invalid height {args.Parameters[5]}"); return; } size.X--; size.Y--; if (map.Size.X > size.X || map.Size.Y > size.Y) { args.Player.SendErrorMessage($"Map size must be smaller than arena size!"); return; } playerInfo.Point = size; playerInfo.State = State.ArenaSetWithSize; args.Player.SendInfoMessage("Set point for create new arena."); } else { playerInfo.State = State.ArenaSet; args.Player.SendInfoMessage("Set 2 point or use The Grand Design for create new arena."); } playerInfo.Name = args.Parameters[1]; playerInfo.Map = map; playerInfo.Align = align; break; #endregion #region Delete case "delete": if (args.Parameters.Count < 2) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /arena delete <name> "); return; } arena = ArenaManager.GetArenaByName(args.Parameters[1]); if (arena == null) { args.Player.SendErrorMessage($"Arena {args.Parameters[1]} does not exist!"); return; } ArenaManager.RemoveArena(arena); args.Player.SendSuccessMessage("Arena deleted successfully."); break; #endregion #region Setmap case "setmap": if (args.Parameters.Count < 3) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /arena setmap <name> <mapname> "); return; } arena = ArenaManager.GetArenaByName(args.Parameters[1]); if (arena == null) { args.Player.SendErrorMessage($"Arena {args.Parameters[1]} does not exist!"); return; } map = MapManager.GetMapByName(args.Parameters[2]); if (map == null) { args.Player.SendErrorMessage($"Map {args.Parameters[2]} does not exist!"); return; } if (map.Size.X > arena.Size.X || map.Size.Y > arena.Size.Y) { args.Player.SendErrorMessage($"Map size must be smaller than arena size!"); return; } ArenaManager.SetMap(arena, map); args.Player.SendSuccessMessage("New map setted."); break; #endregion #region Align case "align": if (args.Parameters.Count < 3) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /arena align <name> <align>"); return; } arena = ArenaManager.GetArenaByName(args.Parameters[1]); if (arena == null) { args.Player.SendErrorMessage($"Arena {args.Parameters[1]} does not exist!"); return; } if (!CheckAlign(args.Player, args.Parameters[2].ToLower())) { return; } align = args.Parameters[2].ToLower(); ArenaManager.SetAlign(arena, align); args.Player.SendSuccessMessage("New align setted."); break; #endregion #region Info case "info": if (args.Parameters.Count < 2) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /arena info <name> [page number]"); return; } arena = ArenaManager.GetArenaByName(args.Parameters[1]); if (arena == null) { args.Player.SendErrorMessage($"Arena {args.Parameters[1]} does not exist!"); return; } int page = 1; if (args.Parameters.Count > 2) { if (!int.TryParse(args.Parameters[2], out page)) { args.Player.SendErrorMessage($"Invalid number {args.Parameters[2]}."); return; } } PaginationTools.SendPage(args.Player, page, ArenaManager.ArenaInfo(arena), new PaginationTools.Settings() { NothingToDisplayString = "Arena not found. Use /arena define <name> <mapname> for create arena.", HeaderFormat = "Arena info ({0}/{1}):", FooterFormat = "Type /arena info " + arena.Name + " {0} for more.", }); break; #endregion #region List case "list": page = 1; if (args.Parameters.Count > 1) { if (!int.TryParse(args.Parameters[1], out page)) { args.Player.SendErrorMessage($"Invalid number {args.Parameters[1]}."); return; } } PaginationTools.SendPage(args.Player, page, PaginationTools.BuildLinesFromTerms(ArenaManager.ArenaList), new PaginationTools.Settings() { NothingToDisplayString = "Arenas not found. Use /arena define for map save", HeaderFormat = "Arena list ({0}/{1}):", FooterFormat = "Type /arena list {0} for more.", }); break; #endregion #region AddParam case "addparam": case "ap": if (args.Parameters.Count < 3) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /arena ap <arenaname> <param>"); return; } string param = args.Parameters[2]; if ((param == "vote" || param == "vt")) { if (args.Parameters.Count != 5) { args.Player.SendErrorMessage($"Invalid syntax! Proper syntax: /arena ap <arenaname> vote [votetime] [voterepeat]"); return; } int i = 0; if (!int.TryParse(args.Parameters[3], out i)) { args.Player.SendErrorMessage($"Invalid number {args.Parameters[3]}!"); return; } if (!int.TryParse(args.Parameters[4], out i)) { args.Player.SendErrorMessage($"Invalid number {args.Parameters[4]}!"); return; } param = string.Format("{0}:{1}:{2}", param, args.Parameters[3], args.Parameters[4]); } if (param == "autochange" || param == "ac") { if (args.Parameters.Count != 5) { args.Player.SendErrorMessage($"Invalid syntax! Proper syntax: /arena ap <arenaname> autochange [maptag] [timer]"); return; } int i = 0; if (!int.TryParse(args.Parameters[3], out i)) { args.Player.SendErrorMessage($"Invalid number{args.Parameters[3]}!"); return; } param = string.Format("{0}:{1}:{2}", param, args.Parameters[3], args.Parameters[4]); } arena = ArenaManager.GetArenaByName(args.Parameters[1]); if (arena == null) { args.Player.SendErrorMessage($"Arena {args.Parameters[1]} does not exist!"); return; } if (!ParamManager.AddParam(arena, param)) { args.Player.SendErrorMessage($"Failed add param!"); return; } args.Player.SendSuccessMessage($"Success add param!"); break; #endregion #region RemoveParam case "removeparam": case "rp": if (args.Parameters.Count < 3) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /arena rp <arenaname> <param>"); return; } param = args.Parameters[2]; arena = ArenaManager.GetArenaByName(args.Parameters[1]); if (arena == null) { args.Player.SendErrorMessage($"Arena {args.Parameters[1]} does not exist!"); return; } if (!ParamManager.RemoveParam(arena, param)) { args.Player.SendErrorMessage($"Failed remove param!"); return; } args.Player.SendSuccessMessage($"Success remove param!"); break; #endregion #region ParamList case "paramlist": case "pl": page = 1; if (args.Parameters.Count > 1) { if (!int.TryParse(args.Parameters[1], out page)) { args.Player.SendErrorMessage($"Invalid number {args.Parameters[1]}."); return; } } var helpList = new List <string> { "vote (vt) - allow vote for arena, require vote time & repeat vote time in seconds.", "autochange (ac) - set random map with given tag in given time in seconds.", "autopvp (ap) - activate players pvp if they in arena area.", "autotp (tp) - teleport into spawn if player not in pvp.", "autoinvise (ai) - give invisibile buff if player not in pvp", "autospawn (as) - teleport into arena spawn if player activate pvp" }; PaginationTools.SendPage(args.Player, page, helpList, new PaginationTools.Settings() { HeaderFormat = "Param list ({0}/{1}):", FooterFormat = "Type /param pl {0} for more.", }); break; #endregion #region Help case "help": page = 1; if (args.Parameters.Count > 1) { if (!int.TryParse(args.Parameters[1], out page)) { args.Player.SendErrorMessage($"Invalid number {args.Parameters[1]}."); return; } } helpList = new List <string> { "define <arenaname> <mapname> [align] [width] [height] - create arena.", "delete <arenaname> - remove arena.", "setmap <arenaname> <mapname> - set new map for arena", "align <arenaname> <align> - set new align for arena", "info <arenaname> - return info about arena", "list [page] - return arena list", "addparam <arenaname> <param> - adds param for arena", "removeparam <arenaname> <param> - remove param for arena", "paramlist [page] - return param list." }; PaginationTools.SendPage(args.Player, page, helpList, new PaginationTools.Settings() { HeaderFormat = "Arena sub command list ({0}/{1}):", FooterFormat = "Type /arena help {0} for more.", }); break; #endregion default: args.Player.SendErrorMessage("Invalid sub command! Check /arena help for more details."); break; } }