예제 #1
0
 /// <summary>
 /// Initializes this Virtual Machine.
 /// </summary>
 public void Init()
 {
     Context.Globals = FSO.Content.Content.Get().WorldObjectGlobals.Get("global");
     PlatformState   = new VMTSOLotState();
     GlobalState     = new short[33];
     GlobalState[20] = 255; //Game Edition. Basically, what "expansion packs" are running. Let's just say all of them.
     GlobalState[25] = 4;   //as seen in EA-Land edith's simulator globals, this needs to be set for people to do their idle interactions.
     GlobalState[17] = 4;   //Runtime Code Version, is this in EA-Land.
     if (Driver is VMServerDriver)
     {
         EODHost = new VMEODHost();
     }
 }
예제 #2
0
파일: VM.cs 프로젝트: kevinmel2000/FreeSO
 /// <summary>
 /// Initializes this Virtual Machine.
 /// </summary>
 public void Init()
 {
     PlatformState   = new VMTSOLotState();
     GlobalState     = new short[38];
     GlobalState[20] = 255; //Game Edition. Basically, what "expansion packs" are running. Let's just say all of them.
     GlobalState[25] = 4;   //as seen in EA-Land edith's simulator globals, this needs to be set for people to do their idle interactions.
     GlobalState[17] = 4;   //Runtime Code Version, is this in EA-Land.
     if (Driver is VMServerDriver)
     {
         EODHost = new VMEODHost();
     }
     #if VM_DESYNC_DEBUG
     Trace = new VMSyncTrace();
     #endif
 }
예제 #3
0
        public virtual void Deserialize(BinaryReader reader)
        {
            ObjectID  = reader.ReadInt16();
            PersistID = reader.ReadUInt32();

            if (this is VMGameObjectMarshal)
            {
                PlatformState = new VMTSOObjectState(Version);
            }
            else
            {
                PlatformState = new VMTSOAvatarState(Version);
            }

            PlatformState.Deserialize(reader);

            var datas = reader.ReadInt32();

            ObjectData = new short[datas];
            for (int i = 0; i < datas; i++)
            {
                ObjectData[i] = reader.ReadInt16();
            }

            var listLen = reader.ReadInt32();

            MyList = new short[listLen];
            for (int i = 0; i < listLen; i++)
            {
                MyList[i] = reader.ReadInt16();
            }

            if (reader.ReadBoolean())
            {
                Headline = new VMRuntimeHeadlineMarshal();
                Headline.Deserialize(reader);
            }

            GUID       = reader.ReadUInt32();
            MasterGUID = reader.ReadUInt32();

            MainParam    = reader.ReadInt16();
            MainStackOBJ = reader.ReadInt16();

            var contN = reader.ReadInt32();

            Contained = new short[contN];
            for (int i = 0; i < contN; i++)
            {
                Contained[i] = reader.ReadInt16();
            }
            Container     = reader.ReadInt16();
            ContainerSlot = reader.ReadInt16();

            var attrN = reader.ReadInt32();

            Attributes = new short[attrN];
            for (int i = 0; i < attrN; i++)
            {
                Attributes[i] = reader.ReadInt16();
            }

            var relN = reader.ReadInt32();

            MeToObject = new VMEntityRelationshipMarshal[relN];
            for (int i = 0; i < relN; i++)
            {
                MeToObject[i] = new VMEntityRelationshipMarshal();
                MeToObject[i].Deserialize(reader);
            }

            if (Version > 7)
            {
                var prelN = reader.ReadInt32();
                MeToPersist = new VMEntityPersistRelationshipMarshal[prelN];
                for (int i = 0; i < prelN; i++)
                {
                    MeToPersist[i] = new VMEntityPersistRelationshipMarshal();
                    MeToPersist[i].Deserialize(reader);
                }
            }
            else
            {
                MeToPersist = new VMEntityPersistRelationshipMarshal[0];
            }

            DynamicSpriteFlags = reader.ReadUInt64();
            if (Version > 2)
            {
                DynamicSpriteFlags2 = reader.ReadUInt64();
            }
            Position = new LotTilePos();
            Position.Deserialize(reader);

            if (Version > 16)
            {
                TimestampLockoutCount = reader.ReadUInt32();
            }

            if (Version > 19)
            {
                LightColor = new Color(reader.ReadUInt32());
            }
        }
예제 #4
0
        public void Load(VMMarshal input)
        {
            var clientJoin = (Context.Architecture == null);
            var oldWorld   = Context.World;

            Context         = new VMContext(input.Context, Context);
            Context.Globals = FSO.Content.Content.Get().WorldObjectGlobals.Get("global");
            Context.VM      = this;
            Context.Architecture.RegenRoomMap();
            Context.RegeneratePortalInfo();

            var oldSounds = new List <VMSoundTransfer>();

            if (Entities != null) //free any object resources here.
            {
                foreach (var obj in Entities)
                {
                    obj.Dead = true;
                    if (obj.HeadlineRenderer != null)
                    {
                        obj.HeadlineRenderer.Dispose();
                    }
                    oldSounds.AddRange(obj.GetActiveSounds());
                }
            }

            Entities    = new List <VMEntity>();
            ObjectsById = new Dictionary <short, VMEntity>();
            foreach (var ent in input.Entities)
            {
                VMEntity realEnt;
                var      objDefinition = FSO.Content.Content.Get().WorldObjects.Get(ent.GUID);
                if (ent is VMAvatarMarshal)
                {
                    var avatar = new VMAvatar(objDefinition);
                    avatar.Load((VMAvatarMarshal)ent);
                    if (UseWorld)
                    {
                        Context.Blueprint.AddAvatar((AvatarComponent)avatar.WorldUI);
                    }
                    realEnt = avatar;
                }
                else
                {
                    var worldObject = new ObjectComponent(objDefinition);
                    var obj         = new VMGameObject(objDefinition, worldObject);
                    obj.Load((VMGameObjectMarshal)ent);
                    Context.Blueprint.AddObject((ObjectComponent)obj.WorldUI);
                    Context.Blueprint.ChangeObjectLocation((ObjectComponent)obj.WorldUI, obj.Position);
                    obj.Position = obj.Position;
                    realEnt      = obj;
                }
                realEnt.GenerateTreeByName(Context);
                Entities.Add(realEnt);
                Context.SetToNextCache.NewObject(realEnt);
                ObjectsById.Add(ent.ObjectID, realEnt);
            }

            int i = 0;

            foreach (var ent in input.Entities)
            {
                var threadMarsh = input.Threads[i];
                var realEnt     = Entities[i++];

                realEnt.Thread = new VMThread(threadMarsh, Context, realEnt);

                if (realEnt is VMAvatar)
                {
                    ((VMAvatar)realEnt).LoadCrossRef((VMAvatarMarshal)ent, Context);
                }
                else
                {
                    ((VMGameObject)realEnt).LoadCrossRef((VMGameObjectMarshal)ent, Context);
                }
            }

            foreach (var multi in input.MultitileGroups)
            {
                new VMMultitileGroup(multi, Context); //should self register
            }

            foreach (var ent in Entities)
            {
                if (ent.Container == null)
                {
                    ent.PositionChange(Context, true);                        //called recursively for contained objects.
                }
            }

            GlobalState   = input.GlobalState;
            PlatformState = input.PlatformState;
            ObjectId      = input.ObjectId;

            //just a few final changes to refresh everything, and avoid signalling objects
            var clock = Context.Clock;

            Context.Architecture.SetTimeOfDay(clock.Hours / 24.0 + clock.Minutes / (24.0 * 60) + clock.Seconds / (24.0 * 60 * 60));

            Context.Architecture.RegenRoomMap();
            Context.RegeneratePortalInfo();
            Context.Architecture.WallDirtyState(input.Context.Architecture);

            foreach (var snd in oldSounds)
            {
                //find new owners
                var obj = GetObjectById(snd.SourceID);
                if (obj == null || obj.Object.GUID != snd.SourceGUID)
                {
                    snd.SFX.Sound.RemoveOwner(snd.SourceID);
                }
                else
                {
                    obj.SoundThreads.Add(snd.SFX);  // successfully transfer sound to new object
                }
            }

            if (clientJoin)
            {
                //run clientJoin functions to play object sounds, update some gfx.
                foreach (var obj in Entities)
                {
                    obj.ExecuteEntryPoint(30, Context, true);
                }
            }

            if (OnFullRefresh != null)
            {
                OnFullRefresh();
            }
        }
예제 #5
0
        public void Deserialize(BinaryReader reader)
        {
            if (new string(reader.ReadChars(4)) != "FSOv")
            {
                return;
            }

            Version    = reader.ReadInt32();
            Compressed = reader.ReadBoolean();

            var uReader = reader;

            if (Compressed)
            {
                var length       = reader.ReadInt32();
                var cStream      = new MemoryStream(reader.ReadBytes(length));
                var zipStream    = new GZipStream(cStream, CompressionMode.Decompress);
                var decompStream = new MemoryStream();
                zipStream.CopyTo(decompStream);
                decompStream.Seek(0, SeekOrigin.Begin);
                reader = new BinaryReader(decompStream);
                cStream.Close();
                zipStream.Close();
            }

            Context = new VMContextMarshal(Version);
            Context.Deserialize(reader);

            int ents = reader.ReadInt32();

            Entities = new VMEntityMarshal[ents];
            for (int i = 0; i < ents; i++)
            {
                var type = reader.ReadByte();
                var ent  = (type == 1) ? (VMEntityMarshal) new VMAvatarMarshal(Version) : new VMGameObjectMarshal(Version);
                ent.Deserialize(reader);
                Entities[i] = ent;
            }

            int thrN = reader.ReadInt32();

            Threads = new VMThreadMarshal[thrN];
            for (int i = 0; i < thrN; i++)
            {
                Threads[i] = new VMThreadMarshal(Version);
                Threads[i].Deserialize(reader);
            }

            int mtgN = reader.ReadInt32();

            MultitileGroups = new VMMultitileGroupMarshal[mtgN];
            for (int i = 0; i < mtgN; i++)
            {
                MultitileGroups[i] = new VMMultitileGroupMarshal(Version);
                MultitileGroups[i].Deserialize(reader);
            }

            int globs = reader.ReadInt32();

            GlobalState = new short[globs];
            for (int i = 0; i < globs; i++)
            {
                GlobalState[i] = reader.ReadInt16();
            }

            //assume TSO for now
            PlatformState = new VMTSOLotState(Version);
            PlatformState.Deserialize(reader);

            ObjectId = reader.ReadInt16();

            if (Compressed)
            {
                reader.BaseStream.Close();
            }
        }
예제 #6
0
파일: VM.cs 프로젝트: kevinmel2000/FreeSO
        public void Load(VMMarshal input)
        {
            var clientJoin = (Context.Architecture == null);

            //var oldWorld = Context.World;
            Context    = new VMContext(input.Context, Context);
            Context.VM = this;
            Context.Architecture.RegenRoomMap();
            Context.RegeneratePortalInfo();
            Context.Architecture.Terrain.RegenerateCenters();

            if (VM.UseWorld)
            {
                Context.Blueprint.Altitude        = Context.Architecture.Terrain.Heights;
                Context.Blueprint.AltitudeCenters = Context.Architecture.Terrain.Centers;
            }

            var oldSounds = new List <VMSoundTransfer>();

            if (Entities != null) //free any object resources here.
            {
                foreach (var obj in Entities)
                {
                    obj.Dead = true;
                    if (obj.HeadlineRenderer != null)
                    {
                        obj.HeadlineRenderer.Dispose();
                    }
                    oldSounds.AddRange(obj.GetActiveSounds());
                }
            }

            Entities = new List <VMEntity>();
            Scheduler.Reset();
            ObjectsById = new Dictionary <short, VMEntity>();
            foreach (var ent in input.Entities)
            {
                VMEntity realEnt;
                var      objDefinition = FSO.Content.Content.Get().WorldObjects.Get(ent.GUID);
                if (ent is VMAvatarMarshal)
                {
                    var avatar = new VMAvatar(objDefinition);
                    avatar.Load((VMAvatarMarshal)ent);
                    if (UseWorld)
                    {
                        Context.Blueprint.AddAvatar((AvatarComponent)avatar.WorldUI);
                    }
                    realEnt = avatar;
                }
                else
                {
                    var worldObject = Context.MakeObjectComponent(objDefinition);
                    var obj         = new VMGameObject(objDefinition, worldObject);
                    obj.Load((VMGameObjectMarshal)ent);
                    if (UseWorld)
                    {
                        Context.Blueprint.AddObject((ObjectComponent)obj.WorldUI);
                        Context.Blueprint.ChangeObjectLocation((ObjectComponent)obj.WorldUI, obj.Position);
                    }
                    obj.Position = obj.Position;
                    realEnt      = obj;
                }
                realEnt.FetchTreeByName(Context);
                Entities.Add(realEnt);
                Context.ObjectQueries.NewObject(realEnt);
                ObjectsById.Add(ent.ObjectID, realEnt);
            }

            int i = 0;

            foreach (var ent in input.Entities)
            {
                var threadMarsh = input.Threads[i];
                var realEnt     = Entities[i++];

                realEnt.Thread = new VMThread(threadMarsh, Context, realEnt);
                Scheduler.ScheduleTickIn(realEnt, 1);

                if (realEnt is VMAvatar)
                {
                    ((VMAvatar)realEnt).LoadCrossRef((VMAvatarMarshal)ent, Context);
                }
                else
                {
                    ((VMGameObject)realEnt).LoadCrossRef((VMGameObjectMarshal)ent, Context);
                }
            }

            foreach (var multi in input.MultitileGroups)
            {
                var grp = new VMMultitileGroup(multi, Context); //should self register
                if (VM.UseWorld)
                {
                    var b      = grp.BaseObject;
                    var avgPos = new LotTilePos();
                    foreach (var obj in grp.Objects)
                    {
                        avgPos += obj.Position;
                    }
                    avgPos /= grp.Objects.Count;

                    foreach (var obj in grp.Objects)
                    {
                        var off = obj.Position - avgPos;
                        obj.WorldUI.MTOffset = new Vector3(off.x, off.y, 0);
                        obj.Position         = obj.Position;
                    }
                }
                var persist = grp.BaseObject?.PersistID ?? 0;
                if (persist != 0 && grp.BaseObject is VMGameObject)
                {
                    Context.ObjectQueries.RegisterMultitilePersist(grp, persist);
                }
            }

            foreach (var ent in Entities)
            {
                if (ent.Container == null)
                {
                    ent.PositionChange(Context, true);                        //called recursively for contained objects.
                }
            }

            GlobalState   = input.GlobalState;
            PlatformState = input.PlatformState;
            ObjectId      = input.ObjectId;

            //just a few final changes to refresh everything, and avoid signalling objects
            var clock = Context.Clock;

            Context.Architecture.SetTimeOfDay(clock.Hours / 24.0 + clock.Minutes / (24.0 * 60) + clock.Seconds / (24.0 * 60 * 60));

            Context.Architecture.SignalAllDirty();
            Context.DisableRouteInvalidation = true;
            Context.Architecture.Tick();
            Context.DisableRouteInvalidation = false;

            Context.Architecture.WallDirtyState(input.Context.Architecture);

            foreach (var snd in oldSounds)
            {
                //find new owners
                var obj = GetObjectById(snd.SourceID);
                if (obj == null || obj.Object.GUID != snd.SourceGUID)
                {
                    snd.SFX.Sound.RemoveOwner(snd.SourceID);
                }
                else
                {
                    obj.SoundThreads.Add(snd.SFX);  // successfully transfer sound to new object
                }
            }

            if (clientJoin)
            {
                //run clientJoin functions to play object sounds, update some gfx.
                foreach (var obj in Entities)
                {
                    obj.ExecuteEntryPoint(30, Context, true);
                }
            }
            Context.UpdateTSOBuildableArea();
            if (OnFullRefresh != null)
            {
                OnFullRefresh();
            }
        }