public static void RegisterPlayer(string _netID, MultiPlayerManager _player) { string _playerID = PLAYER_ID_PREFIX + _netID; players.Add(_playerID, _player); _player.transform.name = _playerID; }
//================================================================================================// /// <summary> /// check if linked route is set /// </summary> public int VerifyRouteSet() { // call route_set routine from main signal if (TrackJunctionNode > 0) { return(MainSignal.CheckRouteSet(JunctionMainNode, TrackJunctionNode) ? 1 : 0); } //added by JTang else if (MultiPlayerManager.IsMultiPlayer()) { TrackNode node = Simulator.Instance.TrackDatabase.TrackDB.TrackNodes[MainSignal.TrackNode]; if (!(node is TrackJunctionNode) && node.TrackPins != null && (int)MainSignal.TrackCircuitDirection < node.TrackPins.Length) { node = Simulator.Instance.TrackDatabase.TrackDB.TrackNodes[node.TrackPins[(int)MainSignal.TrackCircuitDirection].Link]; if (!(node is TrackJunctionNode junctionNode)) { return(0); } for (int pin = junctionNode.InPins; pin < junctionNode.InPins + junctionNode.OutPins; pin++) { if (junctionNode.TrackPins[pin].Link == MainSignal.TrackNode && pin - junctionNode.InPins != junctionNode.SelectedRoute) { return(0); } } } } return(1); }
void CmdPlayerShot(string _playerID, int _damage) { Debug.Log(_playerID + " has been shot"); MultiPlayerManager _player = MultiManager.GetPlayer(_playerID); _player.RpcTakeDamage(_damage); }
internal override void BeginRender(RenderFrame frame) { // Do this here (instead of RenderProcess) because we only want to measure/time the running game. if (Game.Settings.Profiling) { if ((Game.Settings.ProfilingFrameCount > 0 && ++profileFrames > Game.Settings.ProfilingFrameCount) || (Game.Settings.ProfilingTime > 0 && Viewer?.RealTime >= Game.Settings.ProfilingTime)) { Game.PopState(); } } if (firstFrame) { // Turn off the 10FPS fixed-time-step and return to running as fast as we can. Game.IsFixedTimeStep = false; Game.InactiveSleepTime = TimeSpan.Zero; // We must create these forms on the main thread (Render) or they won't pump events correctly. if (MultiPlayerManager.IsMultiPlayer() || Game.Settings.ViewDispatcher) { Program.DebugViewer = new DispatchViewer(Viewer); Program.DebugViewer.Hide(); Viewer.DebugViewerEnabled = false; } Program.SoundDebugForm = new SoundDebugForm(Viewer); Program.SoundDebugForm.Hide(); Viewer.SoundDebugFormEnabled = false; firstFrame = false; } Viewer.BeginRender(frame); }
public void onUserLeftRoom(RoomData eventObj, string username) { Debug.Log("onUserLeftRoom : " + username); if (username != MultiPlayerManager.Instance.Username && Globals.IS_IN_GAME && !GameManager.Instance.IsGameOver) { GameManager.Instance.WinGame(MultiPlayerManager.Instance.PlayerSide, MultiPlayerManager.ParseUsername(username) + " gave up"); } }
public override void OnStartClient() { base.OnStartClient(); string _netID = GetComponent <NetworkIdentity>().netId.ToString(); MultiPlayerManager _player = GetComponent <MultiPlayerManager>(); MultiManager.RegisterPlayer(_netID, _player); }
public void InitMessage() { Visible = true; keyboardInput.SuspendForOverlayInput(); game.Window.TextInput += Window_TextInput; if (!string.IsNullOrEmpty(MultiPlayerManager.Instance().lastSender)) { messageLabel.Text = MultiPlayerManager.Instance().lastSender + ":"; } }
private void SendMessage() { //we need to send message out string user = ""; if (string.IsNullOrEmpty(MultiPlayerManager.Instance().lastSender)) //server will broadcast the message to everyone { user = MultiPlayerManager.IsServer() ? string.Join("", MultiPlayerManager.OnlineTrains.Players.Keys.Select((string k) => $"{k}\r")) + "0END" : "0Server\r0END"; } string msg = messageText.ToString(); int index = msg.IndexOf(':'); if (index > 0) { msg = messageText.ToString(index + 1, messageText.Length - index - 1); IEnumerable <string> onlinePlayers = messageLabel.Text.Substring(0, index) .Split(',') .Select((string n) => n.Trim()) .Where((string nt) => MultiPlayerManager.OnlineTrains.Players.ContainsKey(nt)) .Select((string nt) => $"{nt}\r"); string newUser = string.Join("", onlinePlayers); if (newUser.Length > 0) { user = newUser; } user += "0END"; } string msgText = new MSGText(MultiPlayerManager.GetUserName(), user, msg).ToString(); try { MultiPlayerManager.Notify(msgText); } #pragma warning disable CA1031 // Do not catch general exception types catch #pragma warning restore CA1031 // Do not catch general exception types { } finally { Visible = false; messageText.Clear(); game.Window.TextInput -= Window_TextInput; keyboardInput.ResumeFromOverlayInput(); } }
public static void RegisterInputEvents(Viewer viewer) { if (null == viewer) { throw new ArgumentNullException(nameof(viewer)); } //In Multiplayer, I maybe the helper, but I can request to be the controller // Horn and bell are managed by UpdateHornAndBell in MSTSLocomotive.cs viewer.UserCommandController.AddEvent(UserCommand.GameRequestControl, KeyEventType.KeyPressed, MultiPlayerManager.RequestControl); viewer.UserCommandController.AddEvent(UserCommand.ControlPantograph1, KeyEventType.KeyPressed, () => MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "PANTO1", (++panto1) % 2).ToString())); viewer.UserCommandController.AddEvent(UserCommand.ControlPantograph2, KeyEventType.KeyPressed, () => MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "PANTO2", (++panto2) % 2).ToString())); viewer.UserCommandController.AddEvent(UserCommand.ControlPantograph3, KeyEventType.KeyPressed, () => MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "PANTO3", (++panto3) % 2).ToString())); viewer.UserCommandController.AddEvent(UserCommand.ControlPantograph4, KeyEventType.KeyPressed, () => MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "PANTO4", (++panto4) % 2).ToString())); viewer.UserCommandController.AddEvent(UserCommand.ControlWiper, KeyEventType.KeyPressed, () => MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "WIPER", (++wiper) % 2).ToString())); viewer.UserCommandController.AddEvent(UserCommand.ControlDoorLeft, KeyEventType.KeyPressed, () => MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "DOORL", (++doorLeft) % 2).ToString())); viewer.UserCommandController.AddEvent(UserCommand.ControlDoorRight, KeyEventType.KeyPressed, () => MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "DOORR", (++doorRight) % 2).ToString())); viewer.UserCommandController.AddEvent(UserCommand.ControlMirror, KeyEventType.KeyPressed, () => MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "MIRRORS", (++mirrors) % 2).ToString())); viewer.UserCommandController.AddEvent(UserCommand.ControlHeadlightIncrease, KeyEventType.KeyPressed, () => { headlight++; if (headlight >= 3) { headlight = 2; } MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "HEADLIGHT", headlight).ToString()); }); viewer.UserCommandController.AddEvent(UserCommand.ControlHeadlightDecrease, KeyEventType.KeyPressed, () => { headlight--; if (headlight < 0) { headlight = 0; } MultiPlayerManager.Notify(new MSGEvent(MultiPlayerManager.GetUserName(), "HEADLIGHT", headlight).ToString()); }); }
private void ShowDispatchControls(bool dispatchView) { var multiPlayer = MultiPlayerManager.IsMultiPlayer() && dispatchView; F.msgAll.Visible = multiPlayer; F.msgSelected.Visible = multiPlayer; F.composeMSG.Visible = multiPlayer; F.MSG.Visible = multiPlayer; F.messages.Visible = multiPlayer; F.AvatarView.Visible = multiPlayer; F.composeMSG.Visible = multiPlayer; F.reply2Selected.Visible = multiPlayer; F.chkShowAvatars.Visible = multiPlayer; F.chkAllowUserSwitch.Visible = multiPlayer; F.chkAllowNew.Visible = multiPlayer; F.chkBoxPenalty.Visible = multiPlayer; F.chkPreferGreen.Visible = multiPlayer; F.btnAssist.Visible = multiPlayer; F.btnNormal.Visible = multiPlayer; F.rmvButton.Visible = multiPlayer; if (multiPlayer) { F.chkShowAvatars.Checked = Simulator.Instance.Settings.ShowAvatar; F.pbCanvas.Location = new System.Drawing.Point(F.pbCanvas.Location.X, F.label1.Location.Y + 18); F.refreshButton.Text = "View Self"; } F.chkDrawPath.Visible = dispatchView; F.chkPickSignals.Visible = dispatchView; F.chkPickSwitches.Visible = dispatchView; F.btnSeeInGame.Visible = dispatchView; F.btnFollow.Visible = dispatchView; F.windowSizeUpDown.Visible = dispatchView; F.label1.Visible = dispatchView; F.resLabel.Visible = dispatchView; F.refreshButton.Visible = dispatchView; }
/// <summary> /// Retrieve a formatted list <see cref="ListLabel"/>s to be displayed as an in-browser Track Monitor. /// </summary> /// <param name="viewer">The Viewer to read train data from.</param> /// <returns>A list of <see cref="ListLabel"/>s, one per row of the popup.</returns> public IEnumerable <ListLabel> MultiPlayerWindowList(Viewer viewer) { //Update data keyPressed = ""; labels = new List <ListLabel>(); void AddLabel(ListLabel label) { CheckLabel(ref label); } void AddSeparator() => AddLabel(new ListLabel { FirstCol = "Sprtr", }); labels.Clear(); UpdateDataEnded = false; // First Block // Client and server may have a time difference. var time = FormatStrings.FormatTime(viewer.Simulator.ClockTime + (MultiPlayerManager.IsClient() ? MultiPlayerManager.Instance().serverTimeDifference : 0)); AddLabel(new ListLabel { FirstCol = $"{CatalogManager.Catalog.GetString("Time")}: {time}", LastCol = "" }); // Separator AddSeparator(); // MultiPlayer if (MultiPlayerManager.IsMultiPlayer()) { string text = MultiPlayerManager.Instance().GetOnlineUsersInfo(); string multiPlayerStatus = MultiPlayerManager.IsServer() ? $"{CatalogManager.Catalog.GetString("Dispatcher")} ({MultiPlayerManager.Client.UserName})" : MultiPlayerManager.Instance().AmAider ? CatalogManager.Catalog.GetString("Helper") : MultiPlayerManager.IsClient() ? $"{CatalogManager.Catalog.GetString("Client")} ({MultiPlayerManager.Client.UserName})" : ""; var status = $"{CatalogManager.Catalog.GetString("Status")}: {multiPlayerStatus}"; AddLabel(new ListLabel { FirstCol = status, LastCol = "" }); AddLabel(new ListLabel()); // Number of player and trains foreach (var t in text.Split('\t')) { AddLabel(new ListLabel { FirstCol = $"{t}", LastCol = "" }); } AddLabel(new ListLabel()); } else if (Simulator.Instance.Confirmer != null) { var status = $"{CatalogManager.Catalog.GetString("Status")}: {CatalogManager.Catalog.GetString("Connection to the server is lost, will play as single mode")}"; AddLabel(new ListLabel { FirstCol = status, LastCol = "" }); AddLabel(new ListLabel()); } AddLabel(new ListLabel()); UpdateDataEnded = true; return(labels); }
private void SendMultiPlayerSkyChangeNotification() { MultiPlayerManager.Instance().SetEnvInfo(mstsskyovercastFactor, mstsskyfogDistance); MultiPlayerManager.Notify(new MSGWeather(-1, mstsskyovercastFactor, -1, mstsskyfogDistance).ToString()); }
/// <summary> /// SkyDrawer constructor /// </summary> public MSTSSkyDrawer(Viewer viewer) { MSTSSkyViewer = viewer; MSTSSkyMaterial = viewer.MaterialManager.Load("MSTSSky"); // Instantiate classes MSTSSkyMesh = new MSTSSkyMesh(MSTSSkyViewer.RenderProcess); MSTSSkyVectors = new SunMoonPos(); //viewer.World.MSTSSky.MSTSSkyMaterial.Viewer.MaterialManager.sunDirection.Y < 0 // Set default values mstsskyseasonType = (int)MSTSSkyViewer.Simulator.Season; date.ordinalDate = 82 + mstsskyseasonType * 91; // TODO: Set the following three externally from ORTS route files (future) date.month = 1 + date.ordinalDate / 30; date.day = 21; date.year = 2010; // Default wind speed and direction mstsskywindSpeed = 5.0f; // m/s (approx 11 mph) mstsskywindDirection = 4.7f; // radians (approx 270 deg, i.e. westerly) // The following keyboard commands are used for viewing sky and weather effects in "demo" mode. // Control- and Control+ for overcast, Shift- and Shift+ for fog and - and + for time. // Don't let multiplayer clients adjust the weather. if (!MultiPlayerManager.IsClient()) { // Overcast ranges from 0 (completely clear) to 1 (completely overcast). viewer.UserCommandController.AddEvent(UserCommand.DebugOvercastIncrease, KeyEventType.KeyDown, (GameTime gameTIme) => { mstsskyovercastFactor = (float)MathHelperD.Clamp(mstsskyovercastFactor + gameTIme.ElapsedGameTime.TotalSeconds / 10, 0, 1); }); viewer.UserCommandController.AddEvent(UserCommand.DebugOvercastDecrease, KeyEventType.KeyDown, (GameTime gameTIme) => { mstsskyovercastFactor = (float)MathHelperD.Clamp(mstsskyovercastFactor - gameTIme.ElapsedGameTime.TotalSeconds / 10, 0, 1); }); // Fog ranges from 10m (can't see anything) to 100km (clear arctic conditions). viewer.UserCommandController.AddEvent(UserCommand.DebugFogIncrease, KeyEventType.KeyDown, (GameTime gameTIme) => { mstsskyfogDistance = (float)MathHelperD.Clamp(mstsskyfogDistance - gameTIme.ElapsedGameTime.TotalSeconds * mstsskyfogDistance, 10, 100000); }); viewer.UserCommandController.AddEvent(UserCommand.DebugFogDecrease, KeyEventType.KeyDown, (GameTime gameTIme) => { mstsskyfogDistance = (float)MathHelperD.Clamp(mstsskyfogDistance + gameTIme.ElapsedGameTime.TotalSeconds * mstsskyfogDistance, 10, 100000); }); } // Don't let clock shift if multiplayer. if (!MultiPlayerManager.IsMultiPlayer()) { // Shift the clock forwards or backwards at 1h-per-second. viewer.UserCommandController.AddEvent(UserCommand.DebugClockForwards, KeyEventType.KeyDown, (GameTime gameTIme) => { MSTSSkyViewer.Simulator.ClockTime += gameTIme.ElapsedGameTime.TotalSeconds * 3600; }); viewer.UserCommandController.AddEvent(UserCommand.DebugClockBackwards, KeyEventType.KeyDown, (GameTime gameTIme) => { MSTSSkyViewer.Simulator.ClockTime -= gameTIme.ElapsedGameTime.TotalSeconds * 3600; }); } // Server needs to notify clients of weather changes. if (MultiPlayerManager.IsServer()) { viewer.UserCommandController.AddEvent(UserCommand.DebugOvercastIncrease, KeyEventType.KeyReleased, SendMultiPlayerSkyChangeNotification); viewer.UserCommandController.AddEvent(UserCommand.DebugOvercastDecrease, KeyEventType.KeyReleased, SendMultiPlayerSkyChangeNotification); viewer.UserCommandController.AddEvent(UserCommand.DebugFogIncrease, KeyEventType.KeyReleased, SendMultiPlayerSkyChangeNotification); viewer.UserCommandController.AddEvent(UserCommand.DebugFogDecrease, KeyEventType.KeyReleased, SendMultiPlayerSkyChangeNotification); } }