Example #1
0
        internal Realm(SharedRealmHandle sharedRealmHandle, RealmConfigurationBase config, RealmSchema schema)
        {
            Config = config;

            RealmState state = null;

            var statePtr = sharedRealmHandle.GetManagedStateHandle();

            if (statePtr != IntPtr.Zero)
            {
                state = GCHandle.FromIntPtr(statePtr).Target as RealmState;
            }

            if (state == null)
            {
                state = new RealmState();
                sharedRealmHandle.SetManagedStateHandle(GCHandle.ToIntPtr(state.GCHandle));
                _states.Value[config.DatabasePath] = new WeakReference <RealmState>(state);
            }

            state.AddRealm(this);

            _state = state;

            SharedRealmHandle = sharedRealmHandle;
            Metadata          = schema.ToDictionary(t => t.Name, CreateRealmObjectMetadata);
            Schema            = schema;
        }
Example #2
0
    public void UpdateWith(RealmState other)
    {
        foreach (KeyValuePair <String, PlayerState> element in other.players)
        {
            PlayerState currentPlayerState;
            if (this.players.TryGetValue(element.Key, out currentPlayerState))
            {
                currentPlayerState.UpdateWith(element.Value);
            }
            else
            {
                this.players.Add(element.Key, element.Value);
            }
        }

        if (this.map == null)
        {
            this.map = new MapState();
        }

        if (other.map != null)
        {
            map.UpdateWith(other.map);
        }
    }
Example #3
0
        /// <inheritdoc />
        public void Dispose()
        {
            if (!IsClosed)
            {
                // only mutate the state on explicit disposal
                // otherwise we do so on the finalizer thread
                if (_state.RemoveRealm(this))
                {
                    _states.Value.Remove(Config.DatabasePath);
                }

                _state = null;
                SharedRealmHandle.Close();  // Note: this closes the *handle*, it does not trigger realm::Realm::close().
            }
        }
Example #4
0
        public static void SendRealmStateResponse(IPacketReceiver client, uint realmNo)
        {
            //uint realmSplitState = 0;
            // realmNo = 0;
            const RealmState realmState = RealmState.Normal;
            var splitDate = "01/01/01";

            using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_REALM_SPLIT, 8 + 1 + splitDate.Length))
            {
                packet.WriteUInt(realmNo);
                packet.WriteUInt((uint)realmState);
                packet.WriteCString(splitDate);

                client.Send(packet, addEnd: false);
            }
        }
Example #5
0
        private void Dispose(bool disposing)
        {
            if (IsClosed)
            {
                return;
            }

            if (disposing)
            {
                // only mutate the state on explicit disposal
                // otherwise we do so on the finalizer thread
                _state.RemoveRealm(this);
            }
            _state = null;

            SharedRealmHandle.Close();  // Note: this closes the *handle*, it does not trigger realm::Realm::close().
        }
Example #6
0
        public bool HandleRealmUpdate(BinaryReader br)
        {
            var realm = PacketHelper.Parse <RealmState>(br);

            if (realm.ID != RealmID)
            {
                return(true);
            }

            RealmState = realm;

            if (RealmStatusChanged != null)
            {
                RealmStatusChanged(this, new EventArgs());
            }

            return(true);
        }
Example #7
0
        public virtual void ReloadState(int frames)
        {
            var realmData = Context.Resolve <RealmData>();

            _teams = new TeamState[realmData.TotalTeams];
            for (var index = 0; index < _teams.Length; index++)
            {
                _teams[index] = new TeamState {
                    SpawnPoints = realmData.SpawnPoints[index % realmData.SpawnPoints.Length].ToArray()
                };
            }

            _states = new RealmState[frames];
            for (var index = 0; index < frames; index++)
            {
                _states[index] = new RealmState {
                    PlayerStates = new PlayerState[realmData.TotalPlayers]
                };
            }
        }
Example #8
0
    // Start is called before the first frame update
    async void Start()
    {
        RealmState initialState = await NetworkConnection.GetStateAsync();

        RealmStateManager.UpdateState(initialState);
        MapManager.InitMap(initialState.map);

        await NetworkConnection.Connect();

        while (NetworkConnection.IsOpen())
        {
            string message = await NetworkConnection.Receive();

            if (!string.IsNullOrEmpty(message))
            {
                try {
                    NetworkMessage <RealmEventBase> networkMessage = NetworkMessageFactory.GetNetworkMessage(message);
                    if (networkMessage != null && networkMessage.realmEvent != null && !string.IsNullOrEmpty(networkMessage.realmEventType))
                    {
                        // Re-parse with the appropriate event type. This is ugly.
                        Type eventType          = RealmEventRegistry.GetEventDataType(networkMessage.realmEventType);
                        Type networkMessageType = typeof(NetworkMessage <>).MakeGenericType(eventType);

                        object genericMessage = NetworkMessageFactory.GetNetworkMessage(message, networkMessageType);
                        object realmEvent     = networkMessageType.GetField("realmEvent").GetValue(genericMessage);

                        RealmStateManager.UpdateState(networkMessage.realmStateFragment);

                        // TODO: Fire off this event and continue. Don't wait for a result.
                        EventManager.TriggerEvent(networkMessage.realmEventType, realmEvent as RealmEventBase);
                        //RealmStateManager.UpdateState(networkMessage.realmStateFragment);
                    }
                } catch (Exception e) {
                    Debug.Log("Exception in NetworkHandler: " + e.Message);
                    Debug.Log(e.StackTrace);
                }
            }
        }
    }
Example #9
0
 public static void UpdateState(RealmState updatedState)
 {
     instance.realmState.UpdateWith(updatedState);
 }
Example #10
0
 public void HandleAccount(string packet)
 {
     string[] data = packet.Split('#');
     string username = data[0];
     string password = data[1].Substring(1);//Sub one, because as a const char '1'
     var account = Database.Tables.AccountTable.GetAccountFromSQL(username);
     if (account != null)
     {
         if (Utilities.Hash.CryptPass(this.EncryptKey, account.Password) == password)
         {
             this.Account = account;
             Database.Tables.AccountTable.UpdateLogged(this.Account.Username, 1);
             this.Send("Ad" + this.Account.Pseudo);
             this.Send("Ac0");
             this.Characters = Managers.MultiServerManager.GetCharactersInformations(this.Account);
             Managers.MultiServerManager.SendServerState(this);
             this.Send("AlK" + (this.Account.AdminLevel > 0 ? 1 : 0));
             this.State = RealmState.SERVER_LIST;
             Utilities.Logger.Infos("Client was logged with the account @'" + username + "'@");
             lock (Managers.MultiServerManager.ConnectedAccounts)
             {
                 if (Managers.MultiServerManager.ConnectedAccounts.Contains(account.Username))
                 {
                     Managers.MultiServerManager.Send(new Interop.Crystal.Packets.KickPlayerMessage(account.Username));
                 }
             }
         }
         else
         {
             this.Send("AlEx");
             Utilities.Logger.Error("Wrong password for account @'" + username + "'@");
         }
     }
     else
     {
         this.Send("AlEx");
         Utilities.Logger.Error("Can't found account @'" + username + "'@");
     }
 }
Example #11
0
 public void HandleVersion(string version)
 {
     if (version == Definitions.DofusVersionRequired)
     {
         this.State = RealmState.ACCOUNT;
     }
     else
     {
         Utilities.Logger.Error("Client has incorrect version of dofus @'" + version + "'@");
         this.Send("AlEv" + Definitions.DofusVersionRequired);
     }
 }
Example #12
0
        private void NotifyRealmState(String strRealmName, RealmState rstate)
        {
            string strStateText = "";
            switch (rstate)
            {
                case RealmState.UP:
                    strStateText = "UP";
                    break;
                case RealmState.DOWN:
                    strStateText = "DOWN";
                    break;
                default:
                    strStateText = null;
                    break;
            }
            if (strStateText == null) { return; }

            AddLogMessage(strRealmName + " is now " + strStateText + ".");
            realmNotifyIcon.BalloonTipText = strRealmName + " is now " + strStateText + ".";
            realmNotifyIcon.BalloonTipIcon = ToolTipIcon.Info;
            realmNotifyIcon.ShowBalloonTip(100);
        }