public void Handle(INetworkStateContext <TWorld> gameStateContext, NetworkCommandConnection networkCommandConnectionToHandle) { var typeToProofAgainst = typeof(UserData).FullName; //Now we look what the roles are and deliver answers if (networkCommandConnectionToHandle.CommandArgument != typeToProofAgainst) { ThrowError(gameStateContext, networkCommandConnectionToHandle); } var convertedInstance = NetworkCommandDataConverterService.ConvertToObject(networkCommandConnectionToHandle); if (convertedInstance as UserData == null) { ThrowError(gameStateContext, networkCommandConnectionToHandle); } //Actual router. Only one state will fire. See that the order of the entries in Router also provides the priority. //TODO: this should be a feature/library in the future var userRoles = UserDataRoleService.GetRoles(convertedInstance as UserData); var userRolesHandler = gameStateContext.GameStateRegistrar.GetNeworkLayerState((byte)Routes.FirstOrDefault(kv => userRoles.HasFlag(kv.Key)).Value); gameStateContext.ChangeHandlerEasier(userRolesHandler, networkCommandConnectionToHandle); userRolesHandler.Handle(gameStateContext, networkCommandConnectionToHandle); }
public void Handle(INetworkStateContext <TWorld> gameStateContext, NetworkCommandConnection networkCommandConnectionToHandle) { //If login command is here. it means that this state is fired first if (networkCommandConnectionToHandle.CommandName == NetworkCommandConstants.LoginCommand) { //send an "ACK" for the worker gameStateContext .CurrentNetOutgoingMessageBusService .SendToClient(NetworkCommandConstants.ReceiveWorkCommand, true, networkCommandConnectionToHandle.Connection); return; } //If receive command if (networkCommandConnectionToHandle.CommandName == NetworkCommandConstants.ReceiveWorkCommand) { var sectorKey = NetworkCommandDataConverterService.ConvertToObject(networkCommandConnectionToHandle) as string; if (string.IsNullOrWhiteSpace(sectorKey)) { return; } var sectorLayerService = gameStateContext.GameStateRegistrar.WorldGameStateDataLayer.GetSector(sectorKey); gameStateContext .CurrentNetOutgoingMessageBusService .SendToClient(NetworkCommandConstants.ReceiveWorkCommand, sectorLayerService.DataLayer as GameStateDataLayer, networkCommandConnectionToHandle.Connection); return; } }
public void ProcessIncomingMessages() { var dataInputs = Input.FetchMessageChunk() .Where(msg => msg.MessageType == NetIncomingMessageType.Data); var inputs = dataInputs .Select(msg => { try { return(NetIncomingMessageNetworkCommand.Translate(msg)); } catch (Exception ex) { Console.WriteLine(ex); } return(null); }) .Where(msg => msg != null) // why do I receive gamestate data?? => because a player needs to be physically bound to a game .else other mechanics depending on getting the players game state for every registered player will fail. .Where(msg => msg.CommandName == NetworkCommandConstants.ReceiveWorkCommand) .Select(msg => { try { var ret = NetworkCommandDataConverterService.ConvertToObject(msg); Console.WriteLine(ret); return(ret); } catch (Exception ex) { Console.WriteLine(ex); } return(null); }) .ToList(); //happens when data layer worker receives an "ACK" from server if (inputs.Any(msg => (msg is bool) && (bool)msg == true)) { Output.SendToClient <string>(NetworkCommandConstants.ReceiveWorkCommand, "hub", Client.ServerConnection); Console.WriteLine("sent package"); return; } foreach (var obj in inputs) { //Console.WriteLine(dataLayer.Enemies.Select(enemy => enemy)); Console.WriteLine((obj as GameStateDataLayer).Enemies.FirstOrDefault().DisplayName); Output.SendToClient <string>(NetworkCommandConstants.ReceiveWorkCommand, "hub", Client.ServerConnection); } }