public void BlueprintReset(string path) { string filename = Path.GetFileName(path); try { using (var file = new BinaryReader(File.OpenRead(Path.Combine(FSOEnvironment.UserDir, "LocalHouse/") + filename.Substring(0, filename.Length - 4) + ".fsov"))) { var marshal = new FSO.SimAntics.Marshals.VMMarshal(); marshal.Deserialize(file); //vm.SendCommand(new VMStateSyncCmd() //{ // State = marshal //}); vm.Load(marshal); vm.Reset(); } } catch (Exception) { var floorClip = Rectangle.Empty; var offset = new Point(); var targetSize = 0; var isIff = path.EndsWith(".iff"); short jobLevel = -1; if (isIff) { jobLevel = short.Parse(path.Substring(path.Length - 6, 2)); } vm.SendCommand(new VMBlueprintRestoreCmd { JobLevel = jobLevel, XMLData = File.ReadAllBytes(path), IffData = isIff, FloorClipX = floorClip.X, FloorClipY = floorClip.Y, FloorClipWidth = floorClip.Width, FloorClipHeight = floorClip.Height, OffsetX = offset.X, OffsetY = offset.Y, TargetSize = targetSize }); } vm.Tick(); if (ActiveFamily == null) { vm.SetGlobalValue(32, 1); vm.SpeedMultiplier = -1; } }
public void LoadState(VM vm, string path) { using (var file = new BinaryReader(File.OpenRead(path))) { var marshal = new VMMarshal(); marshal.Deserialize(file); vm.Load(marshal); CleanLot(); vm.Reset(); } }
public override void Deserialize(BinaryReader reader) { State = new VMMarshal(); using (var decomp = new GZipStream(reader.BaseStream, CompressionMode.Decompress)) { using (var bin = new BinaryReader(decomp)) { State.Deserialize(bin); } } }
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(); }
public override void Deserialize(BinaryReader reader) { State = new VMMarshal(); State.Deserialize(reader); }
public void Load(VMMarshal input) { var oldWorld = Context.World; Context = new VMContext(input.Context, oldWorld); Context.Globals = FSO.Content.Content.Get().WorldObjectGlobals.Get("global"); Context.VM = this; Context.Architecture.RegenRoomMap(); Context.RegeneratePortalInfo(); 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); obj.RefreshBlueprint(Context); obj.Position = obj.Position; realEnt = obj; } realEnt.GenerateTreeByName(Context); Entities.Add(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) ent.PositionChange(Context, true); GlobalState = input.GlobalState; ObjectId = input.ObjectId; //just a few final changes to refresh everything, and avoid signalling objects Context.Architecture.RegenRoomMap(); Context.RegeneratePortalInfo(); Context.Architecture.WallDirtyState(input.Context.Architecture); if (OnFullRefresh != null) OnFullRefresh(); }