Пример #1
0
        public LotConnectionRegulator([Named("City")] AriesClient cityClient, [Named("Lot")] AriesClient lotClient, IClientDataService dataService)
        {
            this.City = cityClient;
            this.City.AddSubscriber(this);

            this.Client = lotClient;
            this.Client.AddSubscriber(this);

            this.DataService = dataService;

            City.AddSubscriber(this);

            AddState("Disconnected")
            .Transition()
            .OnData(typeof(JoinLotRequest)).TransitionTo("SelectLot")
            .Default();

            AddState("SelectLot").OnlyTransitionFrom("Disconnected");
            AddState("FindLot").OnlyTransitionFrom("SelectLot").OnData(typeof(FindLotResponse)).TransitionTo("FoundLot");
            AddState("FoundLot").OnlyTransitionFrom("FindLot");

            AddState("OpenSocket")
            .OnData(typeof(AriesConnected)).TransitionTo("SocketOpen")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnlyTransitionFrom("FoundLot");

            AddState("SocketOpen")
            .OnData(typeof(RequestClientSession)).TransitionTo("RequestClientSession")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnlyTransitionFrom("OpenSocket");

            AddState("RequestClientSession")
            .OnData(typeof(HostOnlinePDU)).TransitionTo("HostOnline")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnlyTransitionFrom("SocketOpen");

            AddState("HostOnline").OnlyTransitionFrom("RequestClientSession");
            AddState("PartiallyConnected")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnData(typeof(FSOVMTickBroadcast)).TransitionTo("LotCommandStream")
            .OnData(typeof(FSOVMDirectToClient)).TransitionTo("LotCommandStream")
            .OnlyTransitionFrom("HostOnline");

            AddState("LotCommandStream")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnData(typeof(FSOVMTickBroadcast)).TransitionTo("LotCommandStream")
            .OnData(typeof(FSOVMDirectToClient)).TransitionTo("LotCommandStream");

            AddState("UnexpectedDisconnect");

            AddState("Disconnect")
            .OnData(typeof(AriesDisconnected))
            .TransitionTo("Disconnected");
        }
Пример #2
0
        public void SessionClosed(AriesClient client)
        {
            LOG.Info("Lot Server " + LotServerConfig.Call_Sign + " disconnected!");
            Connected   = false;
            _Connecting = false;

            if (OnDisconnected != null)
            {
                OnDisconnected(this);
            }
        }
Пример #3
0
 public void MessageReceived(AriesClient client, object message)
 {
     if (message is InstantMessage instantMsg)
     {
         if (instantMsg.Type == InstantMessageType.MESSAGE || instantMsg.Type == InstantMessageType.FAILURE_ACK)
         {
             GameThread.NextUpdate((_) =>
             {
                 HandleInstantMessage((InstantMessage)message);
             });
         }
     }
 }
Пример #4
0
        public void MessageReceived(AriesClient client, object message)
        {
            if (message is IGluonCall)
            {
                var call = (IGluonCall)message;
                if (Callbacks.ContainsKey(call.CallId))
                {
                    Callbacks[call.CallId].SetResult(call);
                    return;
                }
            }

            Router.Handle(this, message);
        }
Пример #5
0
        public ClientDataService(IModelSerializer serializer,
                                 FSO.Content.Content content,
                                 IKernel kernel) : base(serializer, content)
        {
            AddProvider(kernel.Get <ClientAvatarProvider>());
            AddProvider(kernel.Get <ClientLotProvider>());
            AddProvider(kernel.Get <ClientCityProvider>());
            CityClient = kernel.Get <AriesClient>("City");
            CityClient.AddSubscriber(this);

            //When a new object is made, this data will be requested automatically
            SetDefaultDataStruct(typeof(Avatar), MaskedStruct.SimPage_Main);

            PollInterval = GameThread.SetInterval(PollTopics, 5000);
        }
Пример #6
0
 public void MessageReceived(AriesClient client, object message)
 {
     if (message is RequestClientSession ||
         message is HostOnlinePDU)
     {
         this.AsyncProcessMessage(message);
     }
     else if (message is AnnouncementMsgPDU)
     {
         GameThread.InUpdate(() => {
             UIScreen.GlobalShowAnnouncement((AnnouncementMsgPDU)message);
         });
     }
     else if (message is ChangeRoommateResponse)
     {
     }
 }
Пример #7
0
        public void MessageReceived(AriesClient client, object message)
        {
            if (client == City)
            {
                if (message is FindLotResponse)
                {
                    AsyncProcessMessage(message);
                }
            }
            else if (client == Client)
            {
                if (message is RequestClientSession ||
                    message is HostOnlinePDU ||
                    message is FSOVMTickBroadcast ||
                    message is FSOVMDirectToClient ||
                    message is ServerByePDU)
                {
                    if (message is ServerByePDU)
                    {
                    }
                    //force in order
                    this.SyncProcessMessage(message);
                }

                if (message is FSOVMProtocolMessage)
                {
                    var msg = (FSOVMProtocolMessage)message;
                    GameThread.InUpdate(() => {
                        if (msg.UseCst)
                        {
                            if (msg.Title != "")
                            {
                                msg.Title = GameFacade.Strings.GetString("223", msg.Title);
                            }
                            msg.Message = GameFacade.Strings.GetString("223", msg.Message);
                        }
                        UIAlert.Alert(msg.Title, msg.Message, true);
                    });
                }
            }
        }
Пример #8
0
 public void MessageReceived(AriesClient client, object message)
 {
     if (client == City)
     {
         if (message is FindLotResponse)
         {
             AsyncProcessMessage(message);
         }
     }
     else
     {
         if (message is RequestClientSession ||
             message is HostOnlinePDU ||
             message is FSOVMTickBroadcast ||
             message is FSOVMDirectToClient)
         {
             //force in order
             this.SyncProcessMessage(message);
         }
     }
 }
Пример #9
0
        public CreateASimRegulator([Named("City")] AriesClient cityClient)
        {
            this.City = cityClient;
            this.City.AddSubscriber(this);

            AddState("Idle")
            .Default()
            .Transition()
            .OnData(typeof(RSGZWrapperPDU))
            .TransitionTo("CreateSim");

            AddState("CreateSim").OnlyTransitionFrom("Idle");
            AddState("Waiting")
            .OnlyTransitionFrom("CreateSim")
            .OnData(typeof(CreateASimResponse))
            .TransitionTo("ProcessResponse");

            AddState("ProcessResponse").OnlyTransitionFrom("Waiting");
            AddState("Error").OnlyTransitionFrom("ProcessResponse");
            AddState("Success").OnlyTransitionFrom("ProcessResponse");
        }
Пример #10
0
 public void SessionIdle(AriesClient client)
 {
 }
Пример #11
0
 public void SessionOpened(AriesClient client)
 {
 }
Пример #12
0
 public void SessionClosed(AriesClient client)
 {
     Status = GluonHostStatus.DISCONNECTED;
 }
Пример #13
0
        public void MessageReceived(AriesClient client, object message)
        {
            if (message is MailResponse)
            {
                var msg = (MailResponse)message;
                GameThread.NextUpdate(x =>
                {
                    switch (msg.Type)
                    {
                    case MailResponseType.NEW_MAIL:
                    case MailResponseType.POLL_RESPONSE:
                    case MailResponseType.SEND_SUCCESS:
                        //cool. we got mail, or got the mail we sent back.
                        if (msg.Messages.Length == 0)
                        {
                            return;                               //didnt actually get anything
                        }
                        foreach (var mail in msg.Messages)
                        {
                            InboxStore.Save(mail);
                        }
                        View.UpdateInbox();
                        if (msg.Type == MailResponseType.POLL_RESPONSE)
                        {
                            //show a message indicating we recieved new mail while we were offline.
                            UIAlert alert = null;
                            alert         = UIScreen.GlobalShowAlert(new UI.Controls.UIAlertOptions
                            {
                                Title   = GameFacade.Strings.GetString("225", "1"),
                                Message = GameFacade.Strings.GetString("225", msg.Messages.Length > 1 ? "3" : "2", new string[] { msg.Messages.Length.ToString() }),
                                Buttons = new UI.Controls.UIAlertButton[]
                                {
                                    new UI.Controls.UIAlertButton(UI.Controls.UIAlertButtonType.Yes, (btn =>
                                    {
                                        //show the inbox
                                        ((CoreGameScreen)UIScreen.Current).OpenInbox();
                                        UIScreen.RemoveDialog(alert);
                                    })),
                                    new UI.Controls.UIAlertButton(UI.Controls.UIAlertButtonType.No, (btn =>
                                    {
                                        UIScreen.RemoveDialog(alert);
                                    }))
                                }
                            }, true);
                        }

                        if (msg.Type != MailResponseType.SEND_SUCCESS)
                        {
                            //alert user that mail has been recieved via sound and flashing icon
                            HIT.HITVM.Get().PlaySoundEvent(UISounds.LetterRecieve);
                            ((CoreGameScreen)UIScreen.Current).FlashInbox(true);
                        }
                        else
                        {
                            HIT.HITVM.Get().PlaySoundEvent(UISounds.LetterSend);
                        }
                        break;
                    }
                });
            }
        }
Пример #14
0
 public void SessionCreated(AriesClient client)
 {
 }
Пример #15
0
 public void InputClosed(AriesClient session)
 {
     AsyncProcessMessage(new AriesDisconnected());
 }
Пример #16
0
        public CityConnectionRegulator(CityClient cityApi, [Named("City")] AriesClient cityClient, IDatabaseService db, IClientDataService ds, IKernel kernel, IShardsDomain shards)
        {
            this.CityApi = cityApi;
            this.Client  = cityClient;
            this.Client.AddSubscriber(this);
            this.DB          = db;
            this.DataService = ds;
            this.Shards      = shards;

            AddState("Disconnected")
            .Default()
            .Transition()
            .OnData(typeof(ShardSelectorServletRequest))
            .TransitionTo("SelectCity");

            AddState("SelectCity")
            .OnlyTransitionFrom("Disconnected", "Reconnecting");

            AddState("ConnectToCitySelector")
            .OnData(typeof(ShardSelectorServletResponse))
            .TransitionTo("CitySelected")
            .OnlyTransitionFrom("SelectCity");

            AddState("CitySelected")
            .OnData(typeof(ShardSelectorServletResponse))
            .TransitionTo("OpenSocket")
            .OnlyTransitionFrom("ConnectToCitySelector");

            AddState("OpenSocket")
            .OnData(typeof(AriesConnected)).TransitionTo("SocketOpen")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnlyTransitionFrom("CitySelected");

            AddState("SocketOpen")
            .OnData(typeof(RequestClientSession)).TransitionTo("RequestClientSession")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnlyTransitionFrom("OpenSocket");

            AddState("RequestClientSession")
            .OnData(typeof(HostOnlinePDU)).TransitionTo("HostOnline")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnlyTransitionFrom("SocketOpen");

            AddState("HostOnline").OnlyTransitionFrom("RequestClientSession");
            AddState("PartiallyConnected")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnData(typeof(ShardSelectorServletRequest)).TransitionTo("CompletePartialConnection")
            .OnlyTransitionFrom("HostOnline");

            AddState("CompletePartialConnection").OnlyTransitionFrom("PartiallyConnected");
            AddState("AskForAvatarData")
            .OnData(typeof(LoadAvatarByIDResponse)).TransitionTo("ReceivedAvatarData")
            .OnlyTransitionFrom("PartiallyConnected", "CompletePartialConnection");
            AddState("ReceivedAvatarData").OnlyTransitionFrom("AskForAvatarData");
            AddState("AskForCharacterData").OnlyTransitionFrom("ReceivedAvatarData");
            AddState("ReceivedCharacterData").OnlyTransitionFrom("AskForCharacterData");

            AddState("Connected")
            .OnData(typeof(AriesDisconnected)).TransitionTo("UnexpectedDisconnect")
            .OnlyTransitionFrom("ReceivedCharacterData");

            AddState("UnexpectedDisconnect");

            AddState("Disconnect")
            .OnData(typeof(AriesDisconnected))
            .TransitionTo("Disconnected");

            AddState("Reconnect")
            .OnData(typeof(AriesDisconnected))
            .TransitionTo("Reconnecting");

            AddState("Reconnecting")
            .OnData(typeof(ShardSelectorServletRequest))
            .TransitionTo("SelectCity")
            .OnlyTransitionFrom("Reconnect");

            GameThread.SetInterval(() =>
            {
                if (Client.IsConnected)
                {
                    Client.Write(new Server.Protocol.Electron.Packets.KeepAlive());
                }
            }, 10000); //keep alive every 10 seconds. prevents disconnection by aggressive NAT.
        }
Пример #17
0
 public void SessionCreated(AriesClient client)
 {
     this.AsyncProcessMessage(new AriesConnected());
 }
Пример #18
0
 public void SessionClosed(AriesClient client)
 {
     AsyncProcessMessage(new AriesDisconnected());
 }
Пример #19
0
        public void MessageReceived(AriesClient client, object message)
        {
            if (message is ChangeRoommateRequest)
            {
                var req = (ChangeRoommateRequest)message;
                if (req.Type == ChangeRoommateType.INVITE)
                {
                    DataService.Request(MaskedStruct.SimPage_Main, req.AvatarId).ContinueWith(x =>
                    {
                        GameThread.InUpdate(() =>
                        {
                            if (((Avatar)x.Result)?.Avatar_Name == null)
                            {
                                return;
                            }
                            var name = ((Avatar)x.Result).Avatar_Name;

                            UIAlert alert = null;
                            alert         = new UIAlert(new UIAlertOptions()
                            {
                                Title   = GameFacade.Strings.GetString("208", "10"),
                                Message = GameFacade.Strings.GetString("208", "11", new string[] { name }),
                                Buttons = new UIAlertButton[]
                                {
                                    new UIAlertButton(UIAlertButtonType.Yes, btn => {
                                        Network.CityClient.Write(new ChangeRoommateRequest
                                        {
                                            Type        = ChangeRoommateType.ACCEPT,
                                            AvatarId    = req.AvatarId,
                                            LotLocation = req.LotLocation
                                        });
                                        UIScreen.RemoveDialog(alert);
                                    }),
                                    new UIAlertButton(UIAlertButtonType.No, btn => {
                                        Network.CityClient.Write(new ChangeRoommateRequest
                                        {
                                            Type        = ChangeRoommateType.DECLINE,
                                            AvatarId    = req.AvatarId,
                                            LotLocation = req.LotLocation
                                        });
                                        UIScreen.RemoveDialog(alert);
                                    })
                                }
                            });
                            UIScreen.GlobalShowDialog(alert, true);
                        });
                    });
                }
            }
            else if (message is ChangeRoommateResponse)
            {
                DataService.Request(MaskedStruct.CurrentCity, 0);
                string title;
                string msg;
                var    resp = (ChangeRoommateResponse)message;
                switch (resp.Type)
                {
                case ChangeRoommateResponseStatus.ACCEPT_SUCCESS:
                    title = GameFacade.Strings.GetString("208", "50");
                    msg   = GameFacade.Strings.GetString("208", "53");
                    break;

                case ChangeRoommateResponseStatus.KICK_SUCCESS:
                    title = GameFacade.Strings.GetString("208", "70");
                    msg   = GameFacade.Strings.GetString("208", "73");
                    break;

                case ChangeRoommateResponseStatus.SELFKICK_SUCCESS:
                    title = GameFacade.Strings.GetString("208", "130");
                    msg   = GameFacade.Strings.GetString("208", "133");
                    if (OnMoveoutResult != null)
                    {
                        OnMoveoutResult(true);
                        OnMoveoutResult = null;
                        return;
                    }
                    break;

                case ChangeRoommateResponseStatus.DECLINE_SUCCESS:
                case ChangeRoommateResponseStatus.INVITE_SUCCESS:
                    return;

                case ChangeRoommateResponseStatus.LOT_MUST_BE_CLOSED:
                case ChangeRoommateResponseStatus.YOU_ARE_NOT_ROOMMATE:
                    //unable to kickout
                    title = GameFacade.Strings.GetString("208", "80");
                    msg   = GameFacade.Strings.GetString("208", "83");
                    break;

                case ChangeRoommateResponseStatus.ROOMIE_ELSEWHERE:
                case ChangeRoommateResponseStatus.OTHER_INVITE_PENDING:
                    title = GameFacade.Strings.GetString("208", "40");
                    msg   = GameFacade.Strings.GetString("208", "43");
                    break;

                case ChangeRoommateResponseStatus.ROOMMATE_LEFT:
                    DataService.Request(MaskedStruct.SimPage_Main, resp.Extra).ContinueWith(x =>
                    {
                        GameThread.InUpdate(() =>
                        {
                            if (((Avatar)x.Result)?.Avatar_Name == null)
                            {
                                return;
                            }
                            var name = ((Avatar)x.Result).Avatar_Name;
                            UIScreen.GlobalShowDialog(new UIAlert(new UIAlertOptions()
                            {
                                Title   = GameFacade.Strings.GetString("208", "100"),
                                Message = GameFacade.Strings.GetString("208", "101", new string[] { name }),
                            }), true);
                        });
                    });
                    return;

                case ChangeRoommateResponseStatus.GOT_KICKED:
                    title = GameFacade.Strings.GetString("208", "90");
                    msg   = GameFacade.Strings.GetString("208", "93");
                    break;

                case ChangeRoommateResponseStatus.UNKNOWN:
                case ChangeRoommateResponseStatus.TOO_MANY_ROOMMATES:
                case ChangeRoommateResponseStatus.YOU_ARE_NOT_OWNER:
                case ChangeRoommateResponseStatus.NO_INVITE_PENDING:
                case ChangeRoommateResponseStatus.LOT_DOESNT_EXIST:
                default:
                    //invitation failed
                    title = GameFacade.Strings.GetString("208", "40");
                    msg   = GameFacade.Strings.GetString("208", "43");
                    break;
                }
                UIScreen.GlobalShowDialog(new UIAlert(new UIAlertOptions()
                {
                    Title   = title,
                    Message = msg,
                }), true);

                if (OnMoveoutResult != null)
                {
                    OnMoveoutResult(false);
                    OnMoveoutResult = null;
                }

                //got kicked out
                //title = GameFacade.Strings.GetString("208", "94");
                //msg = GameFacade.Strings.GetString("208", "93");
            }
        }
Пример #20
0
 public void InputClosed(AriesClient session)
 {
     Console.WriteLine("close2");
     AsyncProcessMessage(new AriesDisconnected());
 }
Пример #21
0
 public void InputClosed(AriesClient session)
 {
 }
Пример #22
0
 public void InputClosed(AriesClient session)
 {
     LOG.Info("Lot Server " + LotServerConfig.Call_Sign + " disconnected! (input closed)");
 }
Пример #23
0
 public void MessageReceived(AriesClient client, object message)
 {
     ((AriesPacketRouter)_Router).Handle(this, message);
 }
Пример #24
0
 public DatabaseService([Named("City")] AriesClient cityClient)
 {
     CityClient = cityClient;
     CityClient.AddSubscriber(this);
 }
Пример #25
0
 public void SessionClosed(AriesClient client)
 {
     Console.WriteLine("close");
     AsyncProcessMessage(new AriesDisconnected());
 }