private void Send(VMNetClient client, VMNetMessage message) { if (OnDirectMessage != null) { OnDirectMessage(client, message); } }
private void DropClient(VMNetClient client) { if (OnDropClient != null) { OnDropClient(client); } }
public void InitializeLot(VMMarshal marshal) { InitializeLot(); vm.MyUID = 1; vm.Load(marshal); vm.ActivateFamily(ActiveFamily); var settings = GlobalSettings.Default; var myClient = new VMNetClient { PersistID = 1, RemoteIP = "local", AvatarState = new VMNetAvatarPersistState() { Name = settings.LastUser ?? "", DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender), BodyOutfit = settings.DebugBody, HeadOutfit = settings.DebugHead, PersistID = 1, SkinTone = (byte)settings.DebugSkin, Gender = (short)(settings.DebugGender ? 1 : 0), Permissions = FSO.SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin, Budget = 1000000 } }; var server = (VMServerDriver)Driver; server.ConnectClient(myClient); GameFacade.Cursor.SetCursor(CursorType.Normal); ZoomLevel = 1; }
public void ForceDisconnect(VMNetClient cli) { if (cli.NetHandle == null) { return; } ((IoSession)cli.NetHandle).Close(false); }
private void SendGenericMessage(VMNetClient client, string title, string msg) { SendDirectCommand(client, new VMGenericDialogCommand { Title = title, Message = msg }); }
public void SendMessage(VMNetClient cli, VMNetMessage msg) { if (cli.NetHandle == null) { return; } ((IoSession)cli.NetHandle).Write(msg); }
public void DisconnectClient(VMNetClient Client) { lock (Clients) { Clients.Remove(Client.PersistID); SendCommand(new VMNetSimLeaveCmd { ActorUID = Client.PersistID }); } }
public void HandleMessage(VMNetClient client, VMNetMessage message) { var cmd = new VMNetCommand(); try { using (var reader = new BinaryReader(new MemoryStream(message.Data))) { if (!cmd.TryDeserialize(reader, false)) { return; //ignore things that should never be sent to the server } } } catch (Exception e) { //corrupt commands are currently a death sentence for the client. nothing should be corrupt over TCP except in rare cases. client.FatalDCMessage = "RECEIVED BAD COMMAND: " + e.ToString(); ClientsToDC.Add(client); return; } if (cmd.Type == VMCommandType.SimJoin) { //note: currently avatars no longer send sim join commands, the server does when it gets the database info. if (SandboxBans.Contains(client.RemoteIP)) { SendGenericMessage(client, "Banned", "You have been banned from this sandbox server!"); ClientsToDC.Add(client); return; } else if (((VMNetSimJoinCmd)cmd.Command).Version != VMNetSimJoinCmd.CurVer) { SendGenericMessage(client, "Version Mismatch", "Your game version does not match the server's. Please update your game."); ClientsToDC.Add(client); return; } SendCommand(cmd.Command); //just go for it. will start the avatar retrieval process. return; } else if (cmd.Type == VMCommandType.RequestResync) { lock (ClientsToSync) { //todo: throttle ProblemTick = ((VMRequestResyncCmd)cmd.Command).TickID; ResyncClients.Add(client); //under clientstosync lock } } else if (cmd.Type != VMCommandType.ChatParameters) { client.InactivityTicks = 0; } cmd.Command.ActorUID = client.PersistID; SendCommand(cmd.Command); }
public void SubmitMessage(uint id, VMNetMessage msg) { lock (Clients) { VMNetClient cli = null; if (Clients.TryGetValue(id, out cli)) { cli.SubmitMessage(msg); } } }
public void DisconnectClient(uint id) { lock (Clients) { VMNetClient client = null; if (Clients.TryGetValue(id, out client)) { DisconnectClient(client); } } }
public override string GetUserIP(uint uid) { lock (Clients) { VMNetClient client = null; Clients.TryGetValue(uid, out client); if (client == null) { return("unknown"); } return(client.RemoteIP); } }
public override void SendDirectCommand(uint pid, VMNetCommandBodyAbstract acmd) { VMNetClient cli = null; lock (Clients) { Clients.TryGetValue(pid, out cli); } if (cli != null) { SendDirectCommand(cli, acmd); } }
public void SessionCreated(IoSession session) { var cli = new VMNetClient() { PersistID = PersistID++, RemoteIP = session.RemoteEndPoint.ToString(), AvatarState = null, }; cli.NetHandle = session; session.SetAttribute('c', cli); lock (Sessions) Sessions.Add(session); }
private void DirectMessage(VMNetClient target, VMNetMessage msg) { object packet = (msg.Type == VMNetMessageType.Direct) ? (object)(new FSOVMDirectToClient() { Data = msg.Data }) : (object)(new FSOVMTickBroadcast() { Data = msg.Data }); Host.Send(target.PersistID, packet); }
public void InitializeLot(string lotName, bool external) { if (lotName == "") { return; } InitializeLot(); if (!external) { if (!Downtown && ActiveFamily != null) { ActiveFamily.SelectWholeFamily(); vm.ActivateFamily(ActiveFamily); } BlueprintReset(lotName); vm.TSOState.Size = (10) | (3 << 8); vm.Context.UpdateTSOBuildableArea(); vm.MyUID = 1; var settings = GlobalSettings.Default; var myClient = new VMNetClient { PersistID = 1, RemoteIP = "local", AvatarState = new VMNetAvatarPersistState() { Name = settings.LastUser ?? "", DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender), BodyOutfit = settings.DebugBody, HeadOutfit = settings.DebugHead, PersistID = 1, SkinTone = (byte)settings.DebugSkin, Gender = (short)(settings.DebugGender ? 1 : 0), Permissions = FSO.SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin, Budget = 1000000 } }; var server = (VMServerDriver)Driver; server.ConnectClient(myClient); GameFacade.Cursor.SetCursor(CursorType.Normal); ZoomLevel = 1; } Frontend = new UISimitoneFrontend(this); this.Add(Frontend); }
public void ConnectClient(VMNetClient client) { lock (Clients) { Clients.Add(client.PersistID, client); SendCommand(new VMNetSimJoinCmd { ActorUID = client.PersistID, AvatarState = client.AvatarState, }); } lock (ClientsToSync) { ClientsToSync.Add(client); } }
public void SendDirectCommand(VMNetClient client, VMNetCommandBodyAbstract acmd) { var cmd = new VMNetCommand(acmd); byte[] data; using (var stream = new MemoryStream()) { using (var writer = new BinaryWriter(stream)) { cmd.SerializeInto(writer); } data = stream.ToArray(); } Send(client, new VMNetMessage(VMNetMessageType.Direct, data)); }
public void ConnectClient(VMNetClient client) { lock (Clients) { Clients.Add(client.PersistID, client); SendCommand(new VMNetSimJoinCmd { ActorUID = client.PersistID, AvatarState = client.AvatarState, }); } lock (ClientsToSync) { if (client.PersistID != uint.MaxValue) { ClientsToSync.Add(client); NewClients.Add(client); //note that the lock for clientstosync is valid for newclients too. } } }
public void RefreshClient(uint id) { //if connection was lost, resends the lot state to the client as if they connected for the first time. //(in case they dropped any packets) VMNetClient client = null; lock (Clients) { if (!Clients.TryGetValue(id, out client)) { return; } } lock (ClientsToSync) { if (client.PersistID != uint.MaxValue) { ClientsToSync.Add(client); NewClients.Add(client); //note that the lock for clientstosync is valid for newclients too. } } }
public void SendDirectCommand(VMNetClient client, VMNetCommandBodyAbstract acmd) { if (client.RemoteIP == "local") { //just breaking sandbox a little SendCommand(acmd); return; } var cmd = new VMNetCommand(acmd); byte[] data; using (var stream = new MemoryStream()) { using (var writer = new BinaryWriter(stream)) { cmd.SerializeInto(writer); } data = stream.ToArray(); } Send(client, new VMNetMessage(VMNetMessageType.Direct, data)); }
public void InitializeLot(string lotName, bool external) { if (lotName == "" || lotName[0] == '!') { return; } InitializeLot(); if (!external) { if (!Downtown && ActiveFamily != null) { ActiveFamily.SelectWholeFamily(); vm.TS1State.ActivateFamily(vm, ActiveFamily); } BlueprintReset(lotName, null); if (vm.LoadErrors.Count > 0) { GameThread.NextUpdate((state) => ShowLoadErrors(vm.LoadErrors, true)); } vm.MyUID = 1; var settings = GlobalSettings.Default; var myClient = new VMNetClient { PersistID = 1, RemoteIP = "local", AvatarState = new VMNetAvatarPersistState() { Name = settings.LastUser ?? "", DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender), BodyOutfit = settings.DebugBody, HeadOutfit = settings.DebugHead, PersistID = 1, SkinTone = (byte)settings.DebugSkin, Gender = (short)(settings.DebugGender ? 1 : 0), Permissions = FSO.SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin, Budget = 1000000 } }; if (Downtown) { var ngbh = Content.Get().Neighborhood; var crossData = ngbh.GameState; var neigh = ngbh.GetNeighborIDForGUID(crossData.DowntownSimGUID); if (neigh != null) { var inv = ngbh.GetInventoryByNID(neigh.Value); if (inv != null) { var hr = inv.FirstOrDefault(x => x.Type == 2 && x.GUID == 7)?.Count ?? 0; var min = inv.FirstOrDefault(x => x.Type == 2 && x.GUID == 8)?.Count ?? 0; Driver.SendCommand(new VMNetSetTimeCmd() { Hours = hr, Minutes = min, }); } } } var server = (VMServerDriver)Driver; server.ConnectClient(myClient); LoadSurrounding(short.Parse(lotName.Substring(lotName.Length - 6, 2))); GameFacade.Cursor.SetCursor(CursorType.Normal); ZoomLevel = 1; } Frontend = new UISimitoneFrontend(this); this.Add(Frontend); }
public void InitializeLot(string lotName, bool external) { if (lotName == "") { return; } var recording = lotName.ToLowerInvariant().EndsWith(".fsor"); CleanupLastWorld(); if (FSOEnvironment.Enable3D) { var rc = new LotView.RC.WorldRC(GameFacade.GraphicsDevice); World = rc; } else { World = new World(GameFacade.GraphicsDevice); } World.Opacity = 1; GameFacade.Scenes.Add(World); var settings = GlobalSettings.Default; var myState = new VMNetAvatarPersistState() { Name = settings.LastUser, DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender), BodyOutfit = settings.DebugBody, HeadOutfit = settings.DebugHead, PersistID = (uint)(new Random()).Next(), SkinTone = (byte)settings.DebugSkin, Gender = (short)(settings.DebugGender ? 0 : 1), Permissions = SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin, Budget = 1000000, }; if (recording) { var stream = new FileStream(lotName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); var rd = new VMFSORDriver(stream); Driver = rd; } else if (external) { var cd = new VMClientDriver(ClientStateChange); SandCli = new FSOSandboxClient(); cd.OnClientCommand += (msg) => { SandCli.Write(new VMNetMessage(VMNetMessageType.Command, msg)); }; cd.OnShutdown += (reason) => SandCli.Disconnect(); SandCli.OnMessage += cd.ServerMessage; SandCli.Connect(lotName); Driver = cd; var dat = new MemoryStream(); var str = new BinaryWriter(dat); myState.SerializeInto(str); var ava = new VMNetMessage(VMNetMessageType.AvatarData, dat.ToArray()); dat.Close(); SandCli.OnConnectComplete += () => { SandCli.Write(ava); }; } else { var globalLink = new VMTSOGlobalLinkStub(); var sd = new VMServerDriver(globalLink); SandServer = new FSOSandboxServer(); Driver = sd; sd.OnDropClient += SandServer.ForceDisconnect; sd.OnTickBroadcast += SandServer.Broadcast; sd.OnDirectMessage += SandServer.SendMessage; SandServer.OnConnect += sd.ConnectClient; SandServer.OnDisconnect += sd.DisconnectClient; SandServer.OnMessage += sd.HandleMessage; SandServer.Start((ushort)37564); } //Driver.OnClientCommand += VMSendCommand; //Driver.OnShutdown += VMShutdown; vm = new VM(new VMContext(World), Driver, new UIHeadlineRendererProvider()); vm.ListenBHAVChanges(); vm.Init(); LotControl = new UILotControl(vm, World); this.AddAt(0, LotControl); var time = DateTime.UtcNow; var tsoTime = TSOTime.FromUTC(time); vm.Context.Clock.Hours = tsoTime.Item1; vm.Context.Clock.Minutes = tsoTime.Item2; if (m_ZoomLevel > 3) { World.Visible = false; LotControl.Visible = false; } if (IDEHook.IDE != null) { IDEHook.IDE.StartIDE(vm); } vm.OnFullRefresh += VMRefreshed; vm.OnChatEvent += Vm_OnChatEvent; vm.OnEODMessage += LotControl.EODs.OnEODMessage; vm.OnRequestLotSwitch += VMLotSwitch; vm.OnGenericVMEvent += Vm_OnGenericVMEvent; if (!external && !recording) { if (!Downtown && ActiveFamily != null) { ActiveFamily.SelectWholeFamily(); vm.ActivateFamily(ActiveFamily); } BlueprintReset(lotName); vm.TSOState.PropertyCategory = 255; vm.Context.Clock.Hours = 0; vm.TSOState.Size = (10) | (3 << 8); vm.Context.UpdateTSOBuildableArea(); var myClient = new VMNetClient { PersistID = myState.PersistID, RemoteIP = "local", AvatarState = myState }; var server = (VMServerDriver)Driver; server.ConnectClient(myClient); GameFacade.Cursor.SetCursor(CursorType.Normal); ZoomLevel = 1; } vm.MyUID = myState.PersistID; ZoomLevel = 1; }
public void InitializeLot(string lotName, bool external) { if (lotName == "") { return; } var recording = lotName.ToLowerInvariant().EndsWith(".fsor"); CleanupLastWorld(); Content.Content.Get().Upgrades.LoadJSONTuning(); if (FSOEnvironment.Enable3D) { var rc = new LotView.RC.WorldRC(GameFacade.GraphicsDevice); World = rc; } else { World = new World(GameFacade.GraphicsDevice); } World.Opacity = 1; GameFacade.Scenes.Add(World); var settings = GlobalSettings.Default; var myState = new VMNetAvatarPersistState() { Name = settings.LastUser, DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender), BodyOutfit = settings.DebugBody, HeadOutfit = settings.DebugHead, PersistID = (uint)(new Random()).Next(), SkinTone = (byte)settings.DebugSkin, Gender = (short)(settings.DebugGender ? 0 : 1), Permissions = SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin, //CustomGUID = 0x396CD3D1, Budget = 1000000, }; if (recording) { var stream = new FileStream(lotName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); var rd = new VMFSORDriver(stream); Driver = rd; } else if (external) { var cd = new VMClientDriver(ClientStateChange); SandCli = new FSOSandboxClient(); cd.OnClientCommand += (msg) => { SandCli.Write(new VMNetMessage(VMNetMessageType.Command, msg)); }; cd.OnShutdown += (reason) => SandCli.Disconnect(); SandCli.OnMessage += cd.ServerMessage; SandCli.Connect(lotName); Driver = cd; var dat = new MemoryStream(); var str = new BinaryWriter(dat); myState.SerializeInto(str); var ava = new VMNetMessage(VMNetMessageType.AvatarData, dat.ToArray()); dat.Close(); SandCli.OnConnectComplete += () => { SandCli.Write(ava); }; } else { var globalLink = new VMTSOGlobalLinkStub(); globalLink.Database = new SimAntics.Engine.TSOGlobalLink.VMTSOStandaloneDatabase(); var sd = new VMServerDriver(globalLink); SandServer = new FSOSandboxServer(); Driver = sd; sd.OnDropClient += SandServer.ForceDisconnect; sd.OnTickBroadcast += SandServer.Broadcast; sd.OnDirectMessage += SandServer.SendMessage; SandServer.OnConnect += sd.ConnectClient; SandServer.OnDisconnect += sd.DisconnectClient; SandServer.OnMessage += sd.HandleMessage; SandServer.Start((ushort)37564); } //Driver.OnClientCommand += VMSendCommand; //Driver.OnShutdown += VMShutdown; vm = new VM(new VMContext(World), Driver, new UIHeadlineRendererProvider()); vm.ListenBHAVChanges(); vm.Init(); LotControl = new UILotControl(vm, World); this.AddAt(0, LotControl); var time = DateTime.UtcNow; var tsoTime = TSOTime.FromUTC(time); vm.Context.Clock.Hours = tsoTime.Item1; vm.Context.Clock.Minutes = tsoTime.Item2; if (m_ZoomLevel > 3) { World.Visible = false; LotControl.Visible = false; } if (IDEHook.IDE != null) { IDEHook.IDE.StartIDE(vm); } vm.OnFullRefresh += VMRefreshed; vm.OnChatEvent += Vm_OnChatEvent; vm.OnEODMessage += LotControl.EODs.OnEODMessage; vm.OnRequestLotSwitch += VMLotSwitch; vm.OnGenericVMEvent += Vm_OnGenericVMEvent; if (!external && !recording) { if (!Downtown && ActiveFamily != null) { ActiveFamily.SelectWholeFamily(); vm.TS1State.ActivateFamily(vm, ActiveFamily); } BlueprintReset(lotName); var experimentalTuning = new Common.Model.DynamicTuning(new List <Common.Model.DynTuningEntry> { new Common.Model.DynTuningEntry() { tuning_type = "overfill", tuning_table = 255, tuning_index = 15, value = 200 }, new Common.Model.DynTuningEntry() { tuning_type = "overfill", tuning_table = 255, tuning_index = 5, value = 200 }, new Common.Model.DynTuningEntry() { tuning_type = "overfill", tuning_table = 255, tuning_index = 6, value = 200 }, new Common.Model.DynTuningEntry() { tuning_type = "overfill", tuning_table = 255, tuning_index = 7, value = 200 }, new Common.Model.DynTuningEntry() { tuning_type = "overfill", tuning_table = 255, tuning_index = 8, value = 200 }, new Common.Model.DynTuningEntry() { tuning_type = "overfill", tuning_table = 255, tuning_index = 9, value = 200 }, new Common.Model.DynTuningEntry() { tuning_type = "feature", tuning_table = 0, tuning_index = 0, value = 1 }, //ts1/tso engine animation timings (1.2x faster) }); vm.ForwardCommand(new VMNetTuningCmd { Tuning = experimentalTuning }); vm.TSOState.PropertyCategory = 255; //11 is community vm.TSOState.ActivateValidator(vm); vm.Context.Clock.Hours = 0; vm.TSOState.Size &= unchecked ((int)0xFFFF0000); vm.TSOState.Size |= (10) | (3 << 8); vm.Context.UpdateTSOBuildableArea(); if (vm.GetGlobalValue(11) > -1) { for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { vm.TSOState.Terrain.Roads[x, y] = 0xF; //crossroads everywhere } } VMLotTerrainRestoreTools.RestoreTerrain(vm); } var myClient = new VMNetClient { PersistID = myState.PersistID, RemoteIP = "local", AvatarState = myState }; var server = (VMServerDriver)Driver; server.ConnectClient(myClient); GameFacade.Cursor.SetCursor(CursorType.Normal); ZoomLevel = 1; } vm.MyUID = myState.PersistID; ZoomLevel = 1; }
//Run on the background thread public void AvatarJoin(IVoltronSession session) { LotActive.WaitOne(); //wait til we're active at least using (var da = DAFactory.Get()) { ClientCount++; var avatar = da.Avatars.Get(session.AvatarId); var rels = da.Relationships.GetOutgoing(session.AvatarId); var jobinfo = da.Avatars.GetJobLevels(session.AvatarId); var inventory = da.Objects.GetAvatarInventory(session.AvatarId); var myRoomieLots = da.Roommates.GetAvatarsLots(session.AvatarId); //might want to use other entries to update the roomies table entirely. var myIgnored = da.Bookmarks.GetAvatarIgnore(session.AvatarId); LOG.Info("Avatar " + avatar.name + " has joined"); //Load all the avatars data var state = StateFromDB(avatar, rels, jobinfo, myRoomieLots, myIgnored); var client = new VMNetClient(); client.AvatarState = state; client.RemoteIP = session.IpAddress; client.PersistID = session.AvatarId; if (TimeToShutdown == 0) { //oops... bad bad bad DropClient(client); return; } var visitorType = DbLotVisitorType.visitor; if (myRoomieLots.Count > 0) { var roomieStatus = myRoomieLots.FindAll(x => x.lot_id == Context.DbId).FirstOrDefault(); if (roomieStatus != null && roomieStatus.is_pending == 0) { switch (roomieStatus.permissions_level) { case 0: case 1: visitorType = DbLotVisitorType.roommate; break; case 2: visitorType = DbLotVisitorType.owner; break; } } } Host.RecordStartVisit(session, visitorType); VMDriver.ConnectClient(client); VMDriver.SendDirectCommand(client, new VMNetAdjHollowSyncCmd { HollowAdj = HollowLots }); var vmInventory = new List <VMInventoryItem>(); foreach (var item in inventory) { vmInventory.Add(InventoryItemFromDB(item)); } VMDriver.SendDirectCommand(client, new VMNetUpdateInventoryCmd { Items = vmInventory }); } }
public void InitializeLot(string lotName, bool external) { if (lotName == "") { return; } CleanupLastWorld(); World = new LotView.World(GameFacade.GraphicsDevice); World.Opacity = 1; GameFacade.Scenes.Add(World); if (external) { //external not yet implemented Driver = new VMClientDriver(ClientStateChange); } else { var globalLink = new VMTSOGlobalLinkStub(); Driver = new VMServerDriver(globalLink); } //Driver.OnClientCommand += VMSendCommand; //Driver.OnShutdown += VMShutdown; vm = new VM(new VMContext(World), Driver, new UIHeadlineRendererProvider()); vm.ListenBHAVChanges(); vm.Init(); LotControl = new UILotControl(vm, World); this.AddAt(0, LotControl); var time = DateTime.UtcNow; var tsoTime = TSOTime.FromUTC(time); vm.Context.Clock.Hours = tsoTime.Item1; vm.Context.Clock.Minutes = tsoTime.Item2; if (m_ZoomLevel > 3) { World.Visible = false; LotControl.Visible = false; } ZoomLevel = Math.Max(ZoomLevel, 4); if (IDEHook.IDE != null) { IDEHook.IDE.StartIDE(vm); } vm.OnFullRefresh += VMRefreshed; vm.OnChatEvent += Vm_OnChatEvent; vm.OnEODMessage += LotControl.EODs.OnEODMessage; vm.OnRequestLotSwitch += VMLotSwitch; vm.OnGenericVMEvent += Vm_OnGenericVMEvent; if (!external) { vm.ActivateFamily(ActiveFamily); BlueprintReset(lotName); vm.Context.Clock.Hours = 0; vm.TSOState.Size = (10) | (3 << 8); vm.Context.UpdateTSOBuildableArea(); vm.MyUID = 1; var settings = GlobalSettings.Default; var myClient = new VMNetClient { PersistID = 1, RemoteIP = "local", AvatarState = new VMNetAvatarPersistState() { Name = settings.LastUser, DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender), BodyOutfit = settings.DebugBody, HeadOutfit = settings.DebugHead, PersistID = 1, SkinTone = (byte)settings.DebugSkin, Gender = (short)(settings.DebugGender ? 1 : 0), Permissions = SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin, Budget = 100000 } }; var server = (VMServerDriver)Driver; server.ConnectClient(myClient); GameFacade.Cursor.SetCursor(CursorType.Normal); ZoomLevel = 1; } }
private void DropClient(VMNetClient target) { //The VM wants us to drop this client. //...uh, tell the host because we don't control the voltron sessions Host.DropClient(target.PersistID); }
public void InitializeLot() { CleanupLastWorld(); if (FSOEnvironment.Enable3D) { var rc = new FSO.LotView.RC.WorldRC(GameFacade.GraphicsDevice); World = rc; } else { World = new FSO.LotView.World(GameFacade.GraphicsDevice); } World.Opacity = 1; GameFacade.Scenes.Add(World); var globalLink = new VMTS1GlobalLinkStub(); Driver = new VMServerDriver(globalLink); vm = new VM(new VMContext(World), Driver, new UIHeadlineRendererProvider()); vm.ListenBHAVChanges(); vm.Init(); using (var file = new BinaryReader(File.OpenRead(Path.Combine(FSOEnvironment.ContentDir, "cas.fsov")))) { var marshal = new FSO.SimAntics.Marshals.VMMarshal(); marshal.Deserialize(file); marshal.PlatformState = new VMTS1LotState(); vm.Load(marshal); vm.Reset(); } vm.Tick(); vm.Context.Clock.Hours = 12; vm.MyUID = uint.MaxValue; var settings = GlobalSettings.Default; var myClient = new VMNetClient { PersistID = uint.MaxValue, RemoteIP = "local", AvatarState = new VMNetAvatarPersistState() { Name = settings.LastUser ?? "", DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender), BodyOutfit = settings.DebugBody, HeadOutfit = settings.DebugHead, PersistID = uint.MaxValue, SkinTone = (byte)settings.DebugSkin, Gender = (short)(settings.DebugGender ? 1 : 0), Permissions = FSO.SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin, Budget = 1000000 } }; var server = (VMServerDriver)Driver; server.ConnectClient(myClient); HeadAvatars = new VMAvatar[18]; for (int i = 0; i < 18; i++) { HeadAvatars[i] = (VMAvatar)vm.Context.CreateObjectInstance(0x7FD96B54, LotTilePos.OUT_OF_WORLD, Direction.NORTH, true).BaseObject; } BodyAvatars = new VMAvatar[18]; for (int i = 0; i < 18; i++) { BodyAvatars[i] = (VMAvatar)vm.Context.CreateObjectInstance(0x7FD96B54, LotTilePos.OUT_OF_WORLD, Direction.NORTH, true).BaseObject; } PopulateSimType("ma"); }