Exemple #1
0
        internal void SaveState(GameClient client)
        {
            List <ClientObjectStateWrapper> ClientObjects = new List <ClientObjectStateWrapper>();
            List <ClientObjectStateWrapper> ClientState   = new List <ClientObjectStateWrapper>();

            foreach (var item in server.StateManager.ClientStates.FirstOrDefault(cs => cs.Client == client).State.Objects.Values)
            {
                ClientObjectStateWrapper objectWrapper = new ClientObjectStateWrapper()
                {
                    Name             = item.Name,
                    AutoCreateObject = item.AutoCreateObject,
                    Known            = item.Known,
                    Sent             = item.Sent,
                    TypeName         = item.Type.AssemblyQualifiedName,
                    Fields           = item.Fields.Values.Select(f => new FieldStateWrapper()
                    {
                        Known = f.Known, Name = f.Name, Sent = f.Sent, Value = f.Value
                    }).ToList()
                };

                ClientState.Add(objectWrapper);
            }

            foreach (var item in server.GameLogicProcessor.ClientNetworkedObjects.Values.Where(co => co.Client == client))
            {
                ClientObjectStateWrapper objectWrapper = new ClientObjectStateWrapper()
                {
                    Name             = item.Name,
                    AutoCreateObject = item.AutoCreateObject,
                    TypeName         = item.OriginalObject.GetType().ToString(),
                    Fields           = item.Fields.Select((f, index) =>
                    {
                        Object oValue = f.GetValue(item.OriginalObject);
                        return(new FieldStateWrapper()
                        {
                            Name = index.ToString(), Value = (oValue != null ? oValue.ToString() : null)
                        });
                    }).ToList()
                };

                ClientObjects.Add(objectWrapper);
            }

            ClientStateWrapper stateWrapper = new ClientStateWrapper(ClientState, ClientObjects);

            storageEngine.SaveState(client.UserId, stateWrapper);
        }
Exemple #2
0
        internal ClientState RestoreState(GameClient client)
        {
            ClientStateWrapper stateWrapper = storageEngine.RestoreState(client.UserId);

            //Recreate the client game state awareness

            ClientState clientState = new ClientState(client);

            foreach (var obj in stateWrapper.ClientState)
            {
                ObjectStateHolder objState = new ObjectStateHolder()
                {
                    AutoCreateObject = obj.AutoCreateObject,
                    Known            = obj.Known,
                    Name             = obj.Name,
                    Sent             = obj.Sent,
                    Type             = Type.GetType(obj.TypeName),
                };

                for (int i = 0; i < obj.Fields.Count; i++)
                {
                    FieldStateWrapper fieldWrapper = obj.Fields[i];

                    objState.Fields.Add(i.ToString(), new FieldStateHolder()
                    {
                        Known = fieldWrapper.Known,
                        Name  = fieldWrapper.Name,
                        Sent  = fieldWrapper.Sent,
                        Value = fieldWrapper.Value
                    });
                }

                clientState.State.Objects.Add(objState.Name, objState);
            }

            //Recreate the clients objects in the server

            foreach (var item in stateWrapper.ClientObjects)
            {
                server.GameLogicProcessor.RestoreClientStateObject(client, item);
            }

            return(clientState);
        }