public virtual void Deserialize(BinaryReader reader) { ObjectID = reader.ReadInt16(); PersistID = reader.ReadUInt32(); if (this is VMGameObjectMarshal) PlatformState = new VMTSOObjectState(); else PlatformState = new VMTSOAvatarState(); 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); } DynamicSpriteFlags = reader.ReadUInt64(); if (Version > 2) DynamicSpriteFlags2 = reader.ReadUInt64(); Position = new LotTilePos(); Position.Deserialize(reader); }
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(); }
/// <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(); }
public virtual void Load(VMEntityMarshal input) { ObjectID = input.ObjectID; PersistID = input.PersistID; PlatformState = input.PlatformState; ObjectData = input.ObjectData; MyList = new LinkedList<short>(input.MyList); MainParam = input.MainParam; //parameters passed to main on creation. MainStackOBJ = input.MainStackOBJ; if (input.MasterGUID != 0) { var masterDef = FSO.Content.Content.Get().WorldObjects.Get(input.MasterGUID); MasterDefinition = masterDef.OBJ; UseTreeTableOf(masterDef); } else MasterDefinition = null; ContainerSlot = input.ContainerSlot; Attributes = new List<short>(input.Attributes); MeToObject = new Dictionary<ushort, List<short>>(); foreach (var obj in input.MeToObject) MeToObject[obj.Target] = new List<short>(obj.Values); DynamicSpriteFlags = input.DynamicSpriteFlags; DynamicSpriteFlags2 = input.DynamicSpriteFlags2; Position = input.Position; if (UseWorld) WorldUI.Visible = GetValue(VMStackObjectVariable.Hidden) == 0; }
public void Deserialize(BinaryReader reader) { if (new string(reader.ReadChars(4)) != "FSOv") return; Version = reader.ReadInt32(); Compressed = reader.ReadBoolean(); var uReader = reader; MemoryStream cStream = null; GZipStream zipStream = null; if (Compressed) { var length = reader.ReadInt32(); cStream = new MemoryStream(reader.ReadBytes(length)); zipStream = new GZipStream(cStream, CompressionMode.Decompress); reader = new BinaryReader(zipStream); } Context = new VMContextMarshal(); 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(); 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(); PlatformState.Deserialize(reader); ObjectId = reader.ReadInt16(); }