public Race(Race copyFrom) { Checkpoints = copyFrom.Checkpoints; SpawnPoints = copyFrom.SpawnPoints; AvailableVehicles = copyFrom.AvailableVehicles; LapsAvailable = copyFrom.LapsAvailable; Trigger = copyFrom.Trigger; Name = copyFrom.Name; Description = copyFrom.Description; }
private void SetUpPlayerForRace(Client client, Race race, bool freeze, int spawnpoint) { if (race == null) return; var selectedModel = unchecked((int)((uint)race.AvailableVehicles[randGen.Next(race.AvailableVehicles.Length)])); var position = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Position; var heading = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Heading; Program.ServerInstance.SendNativeCallToPlayer(client, 0x06843DA7060A026B, new LocalPlayerArgument(), position.X, position.Y, position.Z, 0, 0, 0, 1); if (race.Checkpoints.Length >= 2) { Vector3 dir = race.Checkpoints[1].Subtract(race.Checkpoints[0]); dir = dir.Normalize(); Program.ServerInstance.SetNativeCallOnTickForPlayer(client, "RACE_CHECKPOINT_MARKER_DIR", 0x28477EC23D892089, 20, race.Checkpoints[0].Subtract(new Vector3() { X = 0f, Y = 0f, Z = -2f }), dir, new Vector3() { X = 60f, Y = 0f, Z = 0f }, new Vector3() { X = 4f, Y = 4f, Z = 4f }, 87, 193, 250, 200, false, false, 2, false, false, false, false); } Program.ServerInstance.SetNativeCallOnTickForPlayer(client, "RACE_CHECKPOINT_MARKER", 0x28477EC23D892089, 1, race.Checkpoints[0], new Vector3(), new Vector3(), new Vector3() { X = 10f, Y = 10f, Z = 2f }, 241, 247, 57, 180, false, false, 2, false, false, false, false); var nt = new Thread((ThreadStart)delegate { SetPlayerInVehicle(client, selectedModel, position, heading, freeze); }); nt.Start(); Opponent curOp = Opponents.FirstOrDefault(op => op.Client == client); if (curOp == null || curOp.Blip == 0) { Program.ServerInstance.GetNativeCallFromPlayer(client, "start_blip", 0x5A039BB0BCA604B6, new IntArgument(), // ADD_BLIP_FOR_COORD delegate (object o) { lock (Opponents) { Opponent secOp = Opponents.FirstOrDefault(op => op.Client == client); if (secOp != null) { secOp.Blip = (int)o; } else Opponents.Add(new Opponent(client) { Blip = (int)o }); } }, race.Checkpoints[0].X, race.Checkpoints[0].Y, race.Checkpoints[0].Z); } else { Program.ServerInstance.SendNativeCallToPlayer(client, 0x45FF974EEE1C8734, curOp.Blip, 255); Program.ServerInstance.SendNativeCallToPlayer(client, 0xAE2AF67E9D9AF65D, curOp.Blip, race.Checkpoints[0].X, race.Checkpoints[0].Y, race.Checkpoints[0].Z); } }
private void StartRace(Race race) { race = new Race(race); //Game.FadeScreenOut(500); CurrentRace = race; /*if (_raceSettings["Laps"] > 1) { _totalLaps = race.Checkpoints.Length; List<Vector3> tmpCheckpoints = new List<Vector3>(); for (int i = 0; i < _raceSettings["Laps"]; i++) { tmpCheckpoints.AddRange(race.Checkpoints); } _currentRace.Checkpoints = tmpCheckpoints.ToArray(); }*/ Opponents.ForEach(op => { op.HasFinished = false; op.CheckpointsPassed = 0; }); lock (Program.ServerInstance.Clients) for (int i = 0; i < Program.ServerInstance.Clients.Count; i++) { SetUpPlayerForRace(Program.ServerInstance.Clients[i], CurrentRace, true, i); } CurrentRaceCheckpoints = race.Checkpoints.ToList(); RaceStart = DateTime.UtcNow; Console.WriteLine("RACE: Starting race " + race.Name); var t = new Thread((ThreadStart) delegate { Thread.Sleep(10000); Program.ServerInstance.SendNotificationToAll("3"); // I should probably automate this Thread.Sleep(1000); Program.ServerInstance.SendNotificationToAll("2"); Thread.Sleep(1000); Program.ServerInstance.SendNotificationToAll("1"); Thread.Sleep(1000); Program.ServerInstance.SendNotificationToAll("Go!"); IsRaceOngoing = true; lock (Opponents) foreach (var opponent in Opponents) { Program.ServerInstance.SendNativeCallToPlayer(opponent.Client, 0x428CA6DBD1094446, opponent.Vehicle, false); opponent.HasStarted = true; } }); t.Start(); }
private void SetUpPlayerForRace(Client client, Race race, bool freeze, int spawnpoint) { if (race == null) { return; } var selectedModel = unchecked ((int)((uint)race.AvailableVehicles[randGen.Next(race.AvailableVehicles.Length)])); var position = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Position; var heading = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Heading; ServerInstance.SendNativeCallToPlayer(client, 0x06843DA7060A026B, new LocalPlayerArgument(), position.X, position.Y, position.Z, 0, 0, 0, 1); if (race.Checkpoints.Length >= 2) { Vector3 dir = race.Checkpoints[1].Subtract(race.Checkpoints[0]); dir = dir.Normalize(); ServerInstance.SetNativeCallOnTickForPlayer(client, "RACE_CHECKPOINT_MARKER_DIR", 0x28477EC23D892089, 20, race.Checkpoints[0].Subtract(new Vector3() { X = 0f, Y = 0f, Z = -2f }), dir, new Vector3() { X = 60f, Y = 0f, Z = 0f }, new Vector3() { X = 4f, Y = 4f, Z = 4f }, 87, 193, 250, 200, false, false, 2, false, false, false, false); } ServerInstance.SetNativeCallOnTickForPlayer(client, "RACE_CHECKPOINT_MARKER", 0x28477EC23D892089, 1, race.Checkpoints[0], new Vector3(), new Vector3(), new Vector3() { X = 10f, Y = 10f, Z = 2f }, 241, 247, 57, 180, false, false, 2, false, false, false, false); var nt = new Thread((ThreadStart) delegate { SetPlayerInVehicle(client, selectedModel, position, heading, freeze); }); nt.Start(); Opponent curOp = Opponents.FirstOrDefault(op => op.Client == client); if (curOp == null || curOp.Blip == 0) { ServerInstance.GetNativeCallFromPlayer(client, "start_blip", 0x5A039BB0BCA604B6, new IntArgument(), // ADD_BLIP_FOR_COORD delegate(object o) { lock (Opponents) { Opponent secOp = Opponents.FirstOrDefault(op => op.Client == client); if (secOp != null) { secOp.Blip = (int)o; } else { Opponents.Add(new Opponent(client) { Blip = (int)o }); } } }, race.Checkpoints[0].X, race.Checkpoints[0].Y, race.Checkpoints[0].Z); } else { ServerInstance.SendNativeCallToPlayer(client, 0x45FF974EEE1C8734, curOp.Blip, 255); ServerInstance.SendNativeCallToPlayer(client, 0xAE2AF67E9D9AF65D, curOp.Blip, race.Checkpoints[0].X, race.Checkpoints[0].Y, race.Checkpoints[0].Z); } }
static void Main() { try { Race.Race ImSpeed = new Race.Race("Air") { RaceDistance = 1000 }; ImSpeed.AddPlayer(new Broom()); ImSpeed.AddPlayer(new MagicCarpet()); ImSpeed.AddPlayer(new Mortar()); Console.WriteLine($"Winner: {ImSpeed.StartRace()}s."); } catch (StartRaceException ex) { Console.WriteLine(ex.Message); } catch (CreateRaceException ex) { Console.WriteLine(ex.Message); } try { Race.Race McQueen = new Race.Race("Ground") { RaceDistance = 2000 }; McQueen.AddPlayer(new TwoHumpedCamel()); McQueen.AddPlayer(new Centaur()); McQueen.AddPlayer(new BootsOfTravel()); Console.WriteLine($"Winner: {McQueen.StartRace()}s."); } catch (StartRaceException ex) { Console.WriteLine(ex.Message); } catch (CreateRaceException ex) { Console.WriteLine(ex.Message); } try { Race.Race multiple = new Race.Race("AllTypes") { RaceDistance = 120 }; multiple.AddPlayer(new TwoHumpedCamel()); multiple.AddPlayer(new Broom()); multiple.AddPlayer(new BootsOfTravel()); multiple.AddPlayer(new Mortar()); Console.WriteLine($"Winner: {multiple.StartRace()}s."); } catch (StartRaceException ex) { Console.WriteLine(ex.Message); } catch (CreateRaceException ex) { Console.WriteLine(ex.Message); } try { Race.Race last = new Race.Race("Air") { RaceDistance = 120 }; last.AddPlayer(new TwoHumpedCamel()); last.AddPlayer(new Broom()); last.AddPlayer(new BootsOfTravel()); last.AddPlayer(new Mortar()); Console.WriteLine($"Winner: {last.StartRace()}s."); } catch (StartRaceException ex) { Console.WriteLine(ex.Message); } catch (CreateRaceException ex) { Console.WriteLine(ex.Message); } }