private async void OnClientDisconnected(ICommunicationMessage e, IClient client, Session session) { var characterSessions = await this.characterManager.ActiveCharacterSessions(); foreach (var vehicle in this.ActiveVehicles.Where(v => v.Handle != null).ToList()) { var nearestCharacter = characterSessions .Where(c => c.IsConnected && c.SessionId != session.Id) .Select(s => new { CharSession = s, Dist = Vector3.Distance(vehicle.Position.ToVector3().ToCitVector3(), s.Character.Position.ToVector3().ToCitVector3()) }) .OrderBy(c => c.Dist) .FirstOrDefault(); if (nearestCharacter == null) { this.Destroy(null, vehicle.NetId ?? 0); } else { this.Transfer(null, vehicle.Id, nearestCharacter.CharSession.Session.UserId); } } }
protected async void Spawn() { var characterSessions = await this.characterManager.ActiveCharacterSessions(); lock (SpawnLock) { var vehiclesToSpawn = this.ActiveVehicles.Where(v => v.Handle == null); foreach (var vehicle in vehiclesToSpawn) { var characterToSpawn = characterSessions .Where(c => c.IsConnected) .Select(s => new { Char = s.Character, Dist = Vector3.Distance(vehicle.Position.ToVector3().ToCitVector3(), s.Character.Position.ToVector3().ToCitVector3()) }) .Where(c => c.Dist < this.Configuration.DespawnDistance) .OrderBy(c => c.Dist) .FirstOrDefault(); if (characterToSpawn == null) { continue; } var characterSession = characterSessions.FirstOrDefault(s => s.Character.Id == characterToSpawn.Char.Id); if (characterSession == null) { continue; } // TODO: Await client response to prevent races. this.comms.Event(VehicleEvents.Spawn).ToClient(this.clientList.Clients.First(c => c.Handle == characterSession.Session.Handle)).Emit(vehicle); } } }
protected void OnClientDisconnect(ClientSessionEventArgs e) { var characterSessions = this.characterManager.ActiveCharacterSessions; foreach (var vehicle in this.ActiveVehicles.Where(v => v.Handle != null).ToList()) { var nearestCharacter = characterSessions .Where(c => c.IsConnected && c.SessionId != e.Session.Id) .Select(s => new { CharSession = s, Dist = Vector3.Distance(vehicle.Position.ToVector3(), s.Character.Position.ToVector3()) }) .OrderBy(c => c.Dist) .FirstOrDefault(); if (nearestCharacter == null) { this.Destroy(null, vehicle.NetId ?? 0); } else { this.Transfer(null, vehicle.Id, nearestCharacter.CharSession.Session.UserId); } } }
protected void SpawnForPlayer(CharacterSessionEventArgs e) { lock (SpawnLock) { var vehiclesToSpawn = this.ActiveVehicles .Where(v => v.Handle == null && Vector3.Distance(v.Position.ToVector3().ToCitVector3(), e.CharacterSession.Character.Position.ToVector3().ToCitVector3()) < this.Configuration.DespawnDistance ); foreach (var vehicle in vehiclesToSpawn) { // TODO: Await client response to prevent races. this.comms.Event(VehicleEvents.Spawn).ToClient(this.clientList.Clients.First(c => c.Handle == e.CharacterSession.Session.Handle)).Emit(vehicle); } } }
protected void Update() { var activeVehicles = this.ActiveVehicles.Where(v => v.Handle != null).ToList(); var characterSessions = this.characterManager.ActiveCharacterSessions; foreach (var vehicle in activeVehicles) { var nearestCharacter = characterSessions .Where(c => c.IsConnected) .Select(s => new { CharSession = s, Dist = Vector3.Distance(vehicle.Position.ToVector3(), s.Character.Position.ToVector3()) }) .OrderBy(c => c.Dist) .FirstOrDefault(); if (nearestCharacter == null) { continue; } if (nearestCharacter.Dist > this.Configuration.DespawnDistance) { Despawn(vehicle.NetId ?? 0, nearestCharacter.CharSession.Session.Handle); } else if (nearestCharacter.CharSession.Session.UserId != vehicle.TrackingUserId) { var trackingUser = characterSessions.FirstOrDefault(s => s.Session.UserId == vehicle.TrackingUserId); if (trackingUser == null) { continue; } this.Rpc.Event(VehicleEvents.Transfer) .Target(this.clientList.Clients.First(c => c.Handle == trackingUser.Session.Handle)) .Trigger(vehicle.Id, nearestCharacter.CharSession.Session.UserId); } } }