protected override List<IPacketWrapper> DispatchAction(INetworkAction action) { List<IPacketWrapper> wrappers = base.DispatchAction(action); switch (action.ActionType) { case NetworkActionType.NetworkTextSay: wrappers.Add( this.WrapPacket(new Packet() { Text = "Chat" }) ); break; case NetworkActionType.NetworkPlayerKick: wrappers.Add( this.WrapPacket(new Packet() { Text = "Kick" }) ); break; case NetworkActionType.NetworkPlayerBan: wrappers.Add( this.WrapPacket(new Packet() { Text = "Ban" }) ); break; case NetworkActionType.NetworkMapAppend: wrappers.Add( this.WrapPacket(new Packet() { Text = "Map" }) ); break; case NetworkActionType.NetworkPlayerKill: wrappers.Add( this.WrapPacket(new Packet() { Text = "Kill" }) ); break; case NetworkActionType.NetworkPlayerMove: wrappers.Add( this.WrapPacket(new Packet() { Text = "Move" }) ); break; case NetworkActionType.NetworkPacketSend: wrappers.Add( this.WrapPacket(new Packet() { Text = "Raw" }) ); break; } return wrappers; }
protected override List<IPacketWrapper> ActionMove(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); // admin.movePlayer <name: player name> <teamId: Team ID> <squadId: Squad ID> <forceKill: boolean> bool forceMove = (action.ActionType == NetworkActionType.NetworkPlayerMoveForce || action.ActionType == NetworkActionType.NetworkPlayerMoveRotateForce); MapModel selectedMap = this.State.MapPool.Values.FirstOrDefault(x => String.Compare(x.Name, this.State.Settings.Current.MapNameText, StringComparison.OrdinalIgnoreCase) == 0); PlayerModel movePlayer = this.State.Players.Values.First(player => player.Uid == action.Scope.Players.First().Uid); if (selectedMap != null) { // If they are just looking to rotate the player through the teams if (action.ActionType == NetworkActionType.NetworkPlayerMoveRotate || action.ActionType == NetworkActionType.NetworkPlayerMoveRotateForce) { int currentTeamId = -1; int.TryParse(movePlayer.Groups.First(group => group.Type == GroupModel.Team).Uid, out currentTeamId); // Avoid divide by 0 error - shouldn't ever be encountered though. if (selectedMap.GameMode.TeamCount > 0) { int newTeamId = (currentTeamId + 1) % (selectedMap.GameMode.TeamCount + 1); action.Now.Groups.Add(new GroupModel() { Type = GroupModel.Team, Uid = newTeamId == 0 ? "1" : newTeamId.ToString(CultureInfo.InvariantCulture) }); } } } wrappers.Add( this.CreatePacket( "admin.movePlayer \"{0}\" {1} {2}", movePlayer.Name, action.Now.Groups.First(group => group.Type == GroupModel.Team).Uid, FrostbiteConverter.BoolToString(forceMove) ) ); return wrappers; }
/// <summary> /// Process a generic network action /// </summary> /// <param name="action"></param> public virtual List<IPacket> Action(INetworkAction action) { List<IPacket> packets = null; List<IPacketWrapper> wrappers = this.DispatchAction(action); if (wrappers != null) { // Fetch all of the packets that are not null packets = wrappers.Where(wrapper => wrapper != null).Select(wrapper => wrapper.Packet).ToList(); // Defer this completed action for now. this.WaitingActions.Wait(action, packets); // Now send the packets foreach (IPacketWrapper wrapper in wrappers) { this.Send(wrapper); } } return packets; }
public List<IPacket> Action(INetworkAction action) { return this.SandboxedProtocol != null ? this.SandboxedProtocol.Action(action) : null; }
public List<IPacket> Action(INetworkAction action) { throw new NotImplementedException(); }
/// <summary> /// Register a new action to await for responses. /// </summary> /// <param name="action">The action being taken</param> /// <param name="requests">A list of packets sent to the game server to complete this action</param> /// <param name="expiration">An optional datetime when this action should expire</param> public void Wait(INetworkAction action, List<IPacket> requests, DateTime? expiration = null) { this.Waiting.TryAdd(action.Uid, new WaitingAction() { Action = action, Requests = new List<IPacket>(requests), Expiration = expiration ?? DateTime.Now.AddSeconds(10) }); }
protected override List<IPacketWrapper> DispatchAction(INetworkAction action) { return new List<IPacketWrapper>(); }
protected virtual List<IPacketWrapper> DispatchAction(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); switch (action.ActionType) { case NetworkActionType.NetworkTextSay: case NetworkActionType.NetworkTextYell: case NetworkActionType.NetworkTextYellOnly: wrappers = this.ActionChat(action); break; case NetworkActionType.NetworkPlayerKill: wrappers = this.ActionKill(action); break; case NetworkActionType.NetworkPlayerKick: wrappers = this.ActionKick(action); break; case NetworkActionType.NetworkPlayerBan: case NetworkActionType.NetworkPlayerUnban: wrappers = this.ActionBan(action); break; case NetworkActionType.NetworkMapAppend: case NetworkActionType.NetworkMapChangeMode: case NetworkActionType.NetworkMapClear: case NetworkActionType.NetworkMapInsert: case NetworkActionType.NetworkMapNext: case NetworkActionType.NetworkMapNextIndex: case NetworkActionType.NetworkMapRemove: case NetworkActionType.NetworkMapRemoveIndex: case NetworkActionType.NetworkMapRestart: case NetworkActionType.NetworkMapRoundNext: case NetworkActionType.NetworkMapRoundRestart: wrappers = this.ActionMap(action); break; case NetworkActionType.NetworkPlayerMoveRotate: case NetworkActionType.NetworkPlayerMoveRotateForce: case NetworkActionType.NetworkPlayerMove: case NetworkActionType.NetworkPlayerMoveForce: wrappers = this.ActionMove(action); break; case NetworkActionType.NetworkPacketSend: if (action.Now.Content != null) { wrappers.AddRange(action.Now.Content.Select(text => this.CreatePacket(text))); } if (action.Now.Packets != null) { wrappers.AddRange(action.Now.Packets.Select(this.WrapPacket)); } break; } return wrappers; }
protected override List<IPacketWrapper> ActionBan(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); String reason = action.Scope.Content != null ? action.Scope.Content.FirstOrDefault() : String.Empty; TimeSubsetModel time = action.Scope.Times != null ? action.Scope.Times.FirstOrDefault() ?? new TimeSubsetModel() : new TimeSubsetModel(); if (action.ActionType == NetworkActionType.NetworkPlayerBan) { if (time.Context == TimeSubsetContext.Permanent) { if (String.IsNullOrEmpty(reason) == true) { wrappers.Add(this.CreatePacket("banList.add guid \"{0}\" perm", action.Scope.Players.First().Uid)); } else { wrappers.Add(this.CreatePacket("banList.add guid \"{0}\" perm \"{1}\"", action.Scope.Players.First().Uid, reason)); } } else if (time.Context == TimeSubsetContext.Time && time.Length.HasValue == true) { if (String.IsNullOrEmpty(reason) == true) { wrappers.Add(this.CreatePacket("banList.add guid \"{0}\" seconds {1}", action.Scope.Players.First().Uid, time.Length.Value.TotalSeconds)); } else { wrappers.Add(this.CreatePacket("banList.add guid \"{0}\" seconds {1} \"{2}\"", action.Scope.Players.First().Uid, time.Length.Value.TotalSeconds, reason)); } } } else if (action.ActionType == NetworkActionType.NetworkPlayerUnban) { var player = action.Scope.Players.FirstOrDefault(); if (player != null) { if (String.IsNullOrEmpty(player.Uid) == false) { wrappers.Add(this.CreatePacket("banList.remove guid \"{0}\"", player.Uid)); } else if (String.IsNullOrEmpty(player.Name) == false) { wrappers.Add(this.CreatePacket("banList.remove name \"{0}\"", player.Name)); } else if (String.IsNullOrEmpty(player.Ip) == false) { wrappers.Add(this.CreatePacket("banList.remove ip \"{0}\"", player.Ip)); } } } wrappers.Add(this.CreatePacket("banList.save")); return wrappers; }
protected override List<IPacketWrapper> ActionKick(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); String reason = action.Scope.Content != null ? action.Scope.Content.FirstOrDefault() : String.Empty; foreach (PlayerModel player in action.Scope.Players) { wrappers.Add(string.IsNullOrEmpty(reason) == false ? this.CreatePacket("admin.kickPlayer \"{0}\" \"{1}\"", player.Name, reason) : this.CreatePacket("admin.kickPlayer \"{0}\"", player.Name)); } return wrappers; }
protected override List<IPacketWrapper> ActionKill(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); String reason = action.Scope.Content != null ? action.Scope.Content.FirstOrDefault() : String.Empty; if (action.Scope.Players != null) { foreach (PlayerModel target in action.Scope.Players) { wrappers.Add(this.CreatePacket("admin.killPlayer \"{0}\"", target.Name)); if (string.IsNullOrEmpty(reason) == false) { wrappers.Add(this.CreatePacket("admin.say \"{0}\" player {1}", reason, target.Name)); } } } return wrappers; }
protected override List<IPacketWrapper> ActionChat(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); if (action.Now.Content != null) { foreach (String chatMessage in action.Now.Content) { String subset = String.Empty; if (action.Scope.Groups == null && action.Scope.Players == null) { subset = "all"; } else if (action.Scope.Players != null && action.Scope.Players.Count > 0) { subset = String.Format(@"player ""{0}""", action.Scope.Players.First().Name); } else if (action.Scope.Groups != null && action.Scope.Groups.Any(group => @group.Type == GroupModel.Team) == true) { subset = String.Format("team {0}", action.Scope.Groups.First(group => @group.Type == GroupModel.Team).Uid); } else if (action.Scope.Groups != null && action.Scope.Groups.Any(group => @group.Type == GroupModel.Team) == true && action.Scope.Groups.Any(group => @group.Type == GroupModel.Squad) == true) { subset = String.Format("squad {0} {1}", action.Scope.Groups.First(group => @group.Type == GroupModel.Team).Uid, action.Scope.Groups.First(group => @group.Type == GroupModel.Squad).Uid); } if (action.ActionType == NetworkActionType.NetworkTextSay) { wrappers.Add(this.CreatePacket("admin.say \"{0}\" {1}", chatMessage, subset)); } else if (action.ActionType == NetworkActionType.NetworkTextYell || action.ActionType == NetworkActionType.NetworkTextYellOnly) { wrappers.Add(this.CreatePacket("admin.yell \"{0}\" 8000 {1}", chatMessage, subset)); } } } return wrappers; }
/// <summary> /// A helper function for sending proxy network actions to the server. /// </summary> /// <remarks> /// <para>The action will be executed with no user specified, so it should always be successful, at least from a permissions point of view.</para> /// </remarks> /// <param name="action">The action to send to the server.</param> /// <returns>The result of the command, check the status for a success message.</returns> public virtual ICommandResult Action(INetworkAction action) { return this.Bubble(new Command() { Name = action.ActionType.ToString(), Scope = new CommandScopeModel() { ConnectionGuid = this.ConnectionGuid }, Parameters = new List<ICommandParameter>() { new CommandParameter() { Data = { NetworkActions = new List<INetworkAction>() { action } } } } }); }
protected override List<IPacketWrapper> ActionKick(INetworkAction action) { throw new NotImplementedException(); }
protected abstract List<IPacketWrapper> ActionMove(INetworkAction action);
protected override List<IPacketWrapper> ActionMove(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); if (action.Now.Groups == null) { action.Now.Groups = new List<GroupModel>(); } if (action.Scope.Players != null) { // admin.movePlayer <name: player name> <teamId: Team ID> <squadId: Squad ID> <forceKill: boolean> bool forceMove = (action.ActionType == NetworkActionType.NetworkPlayerMoveForce || action.ActionType == NetworkActionType.NetworkPlayerMoveRotateForce); MapModel selectedMap = this.State.MapPool.Select(m => m.Value).FirstOrDefault(map => String.Compare(map.Name, this.State.Settings.Current.MapNameText, StringComparison.OrdinalIgnoreCase) == 0 && map.GameMode != null && String.Compare(map.GameMode.Name, this.State.Settings.Current.GameModeNameText, StringComparison.OrdinalIgnoreCase) == 0); foreach (var movePlayer in action.Scope.Players) { // Lookup the player from the state. The command may only include basic information, or just include // the Uid and nothing more. PlayerModel stateMovePlayer; this.State.Players.TryGetValue(movePlayer.Uid, out stateMovePlayer); if (stateMovePlayer != null) { if (selectedMap != null) { // If they are just looking to rotate the player through the teams if (action.ActionType == NetworkActionType.NetworkPlayerMoveRotate || action.ActionType == NetworkActionType.NetworkPlayerMoveRotateForce) { int currentTeamId = -1; int.TryParse(stateMovePlayer.Groups.First(group => @group.Type == GroupModel.Team).Uid, out currentTeamId); var teams = selectedMap.Groups.Count(group => @group.Type == GroupModel.Team); // Avoid divide by 0 error - shouldn't ever be encountered though. if (selectedMap.GameMode != null && teams > 0) { int newTeamId = (currentTeamId + 1) % (teams + 1); action.Now.Groups.Add(new GroupModel() { Type = GroupModel.Team, Uid = newTeamId == 0 ? "1" : newTeamId.ToString(CultureInfo.InvariantCulture) }); } } // Now check if the destination squad is supported. if (selectedMap.GameMode != null && (selectedMap.GameMode.Name == "SQDM" || selectedMap.GameMode.Name == "SQRUSH")) { if (selectedMap.GameMode.DefaultGroups.Find(group => @group.Type == GroupModel.Squad) != null) { action.Now.Groups.Add(selectedMap.GameMode.DefaultGroups.Find(group => @group.Type == GroupModel.Squad)); } } } // Fix up the team uid if (action.Now.Groups.FirstOrDefault(group => @group.Type == GroupModel.Team) == null) { if (stateMovePlayer.Groups.FirstOrDefault(group => @group.Type == GroupModel.Team) != null) { // No destination team set, use the players current team. action.Now.Groups.Add(stateMovePlayer.Groups.First(group => @group.Type == GroupModel.Team)); } else { // Panic, set team uid to 1. action.Now.Groups.Add(new GroupModel() { Uid = "1" }); } } // Fix up the squad uid if (action.Now.Groups.FirstOrDefault(group => @group.Type == GroupModel.Squad) == null) { if (selectedMap != null && selectedMap.GameMode != null && selectedMap.GameMode.DefaultGroups.FirstOrDefault(group => @group.Type == GroupModel.Squad) != null) { action.Now.Groups.Add(selectedMap.GameMode.DefaultGroups.First(group => @group.Type == GroupModel.Squad)); } else { action.Now.Groups.Add(new GroupModel() { Uid = "0" }); } } wrappers.Add(this.CreatePacket( "admin.movePlayer \"{0}\" {1} {2} {3}", stateMovePlayer.Name, action.Now.Groups.First(group => @group.Type == GroupModel.Team).Uid, action.Now.Groups.First(group => @group.Type == GroupModel.Squad).Uid, FrostbiteConverter.BoolToString(forceMove) )); } } } return wrappers; }
protected virtual List<IPacketWrapper> ActionRaw(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); wrappers.AddRange(action.Now.Content.Select(text => this.CreatePacket(text))); wrappers.AddRange(action.Now.Packets.Select(this.WrapPacket)); return wrappers; }
protected override List<IPacketWrapper> ActionMap(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); foreach (MapModel map in action.Now.Maps) { var closureMap = map; if (action.ActionType == NetworkActionType.NetworkMapAppend) { wrappers.Add(this.CreatePacket("mapList.append \"{0}\" {1}", map.Name, map.Rounds)); wrappers.Add(this.CreatePacket("mapList.save")); wrappers.Add(this.CreatePacket("mapList.list rounds")); } else if (action.ActionType == NetworkActionType.NetworkMapChangeMode) { if (map.GameMode != null) { wrappers.Add(this.CreatePacket("admin.setPlaylist \"{0}\"", map.GameMode.Name)); } } else if (action.ActionType == NetworkActionType.NetworkMapInsert) { wrappers.Add(this.CreatePacket("mapList.insert {0} \"{1}\" {2}", map.Index, map.Name, map.Rounds)); wrappers.Add(this.CreatePacket("mapList.save")); wrappers.Add(this.CreatePacket("mapList.list rounds")); } else if (action.ActionType == NetworkActionType.NetworkMapRemove) { var matchingMaps = this.State.Maps.Where(m => m.Value.Name == closureMap.Name).OrderByDescending(m => m.Value.Index); wrappers.AddRange(matchingMaps.Select(match => this.CreatePacket("mapList.remove {0}", match.Value.Index))); wrappers.Add(this.CreatePacket("mapList.save")); wrappers.Add(this.CreatePacket("mapList.list rounds")); } else if (action.ActionType == NetworkActionType.NetworkMapRemoveIndex) { wrappers.Add(this.CreatePacket("mapList.remove {0}", map.Index)); wrappers.Add(this.CreatePacket("mapList.list rounds")); } else if (action.ActionType == NetworkActionType.NetworkMapNextIndex) { wrappers.Add(this.CreatePacket("mapList.nextLevelIndex {0}", map.Index)); } else if (action.ActionType == NetworkActionType.NetworkMapRestart || action.ActionType == NetworkActionType.NetworkMapRoundRestart) { wrappers.Add(this.CreatePacket("admin.restartRound")); } else if (action.ActionType == NetworkActionType.NetworkMapNext || action.ActionType == NetworkActionType.NetworkMapRoundNext) { wrappers.Add(this.CreatePacket("admin.runNextRound")); } else if (action.ActionType == NetworkActionType.NetworkMapClear) { wrappers.Add(this.CreatePacket("mapList.clear")); wrappers.Add(this.CreatePacket("mapList.save")); } } return wrappers; }
protected override List<IPacketWrapper> ActionMove(INetworkAction action) { throw new System.NotImplementedException(); }
public List<IPacket> Action(INetworkAction action) { return null; }
protected override List<IPacketWrapper> ActionMap(INetworkAction action) { List<IPacketWrapper> wrappers = new List<IPacketWrapper>(); // If it's centered around a list of maps (adding, removing etc) if (action.Now.Maps != null && action.Now.Maps.Count > 0) { foreach (MapModel map in action.Now.Maps) { var closureMap = map; if (action.ActionType == NetworkActionType.NetworkMapAppend) { // mapList.add <map: string> <gamemode: string> <rounds: integer> [index: integer] wrappers.Add(this.CreatePacket("mapList.add \"{0}\" \"{1}\" {2}", map.Name, closureMap.GameMode.Name, map.Rounds)); wrappers.Add(this.CreatePacket("mapList.save")); wrappers.Add(this.CreatePacket("mapList.list")); } // Added by Imisnew2 - You should check this phogue! else if (action.ActionType == NetworkActionType.NetworkMapChangeMode) { if (map.GameMode != null) { wrappers.Add(this.CreatePacket("admin.setPlaylist \"{0}\"", map.GameMode.Name)); } } else if (action.ActionType == NetworkActionType.NetworkMapInsert) { // mapList.add <map: string> <gamemode: string> <rounds: integer> [index: integer] wrappers.Add(this.CreatePacket("mapList.add \"{0}\" \"{1}\" {2} {3}", map.Name, closureMap.GameMode.Name, map.Rounds, map.Index)); wrappers.Add(this.CreatePacket("mapList.save")); wrappers.Add(this.CreatePacket("mapList.list")); } else if (action.ActionType == NetworkActionType.NetworkMapRemove) { var matchingMaps = this.State.Maps.Where(m => m.Value.Name == closureMap.Name).OrderByDescending(m => m.Value.Index); wrappers.AddRange(matchingMaps.Select(match => this.CreatePacket("mapList.remove {0}", match.Value.Index))); wrappers.Add(this.CreatePacket("mapList.save")); wrappers.Add(this.CreatePacket("mapList.list")); } else if (action.ActionType == NetworkActionType.NetworkMapRemoveIndex) { wrappers.Add(this.CreatePacket("mapList.remove {0}", map.Index)); wrappers.Add(this.CreatePacket("mapList.list")); } else if (action.ActionType == NetworkActionType.NetworkMapNextIndex) { wrappers.Add(this.CreatePacket("mapList.setNextMapIndex {0}", map.Index)); } } } else { // The action does not need a map to function if (action.ActionType == NetworkActionType.NetworkMapRestart || action.ActionType == NetworkActionType.NetworkMapRoundRestart) { wrappers.Add(this.CreatePacket("mapList.restartRound")); } else if (action.ActionType == NetworkActionType.NetworkMapNext || action.ActionType == NetworkActionType.NetworkMapRoundNext) { wrappers.Add(this.CreatePacket("mapList.runNextRound")); } else if (action.ActionType == NetworkActionType.NetworkMapClear) { wrappers.Add(this.CreatePacket("mapList.clear")); wrappers.Add(this.CreatePacket("mapList.save")); } } return wrappers; }
public List<IPacket> Action(INetworkAction action) { return this.OnActionHandler != null ? this.OnActionHandler(action) : null; }
protected virtual void OnExpired(INetworkAction action, List<IPacket> requests, List<IPacket> responses) { Action<INetworkAction, List<IPacket>, List<IPacket>> handler = Expired; if (handler != null) { handler(action, requests, responses); } }
public void PlayerActionRequest(INetworkAction action) { action.SenRequest(); // TODO put game id here }