Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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);
                }
            }
        }
Exemplo n.º 5
0
        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);
                }
            }
        }