private void RespawnPlayer(Client client, Race race, int checkpoint) { if (race == null) { return; } Opponent inOp = Opponents.FirstOrDefault(op => op.Client == client); int selectedModel = 0; int color1 = 0; int color2 = 0; if (inOp != null) { selectedModel = API.getEntityModel(inOp.Vehicle); color1 = API.getVehiclePrimaryColor(inOp.Vehicle); color2 = API.getVehicleSecondaryColor(inOp.Vehicle); } if (selectedModel == 0) { selectedModel = unchecked ((int)(race.AvailableVehicles[randGen.Next(race.AvailableVehicles.Length)])); } var position = CurrentRaceCheckpoints[checkpoint]; var next = position; if (CurrentRaceCheckpoints.Count > checkpoint + 1) { next = CurrentRaceCheckpoints[checkpoint + 1]; } else { next = CurrentRaceCheckpoints[checkpoint - 1]; } float heading; var direction = next - position; direction.Normalize(); var radAtan = -Math.Atan2(direction.X, direction.Y); heading = (float)(radAtan * 180f / Math.PI); API.setEntityPosition(client.handle, position); Vector3 newDir = null; if (CurrentRaceCheckpoints.Count > checkpoint + 2) { Vector3 dir = CurrentRaceCheckpoints[checkpoint + 2].Subtract(CurrentRaceCheckpoints[checkpoint + 1]); dir.Normalize(); newDir = dir; } var nextPos = CurrentRaceCheckpoints[checkpoint + 1]; if (newDir == null) { API.triggerClientEvent(client, "setNextCheckpoint", nextPos, true, false); } else { API.triggerClientEvent(client, "setNextCheckpoint", nextPos, false, false, newDir, CurrentRaceCheckpoints[checkpoint + 2]); } var playerVehicle = API.createVehicle((VehicleHash)selectedModel, position, new Vector3(0, 0, heading), color1, color2); API.setPlayerIntoVehicle(client, playerVehicle, -1); lock (Opponents) { if (inOp != null) { API.deleteEntity(inOp.Vehicle); inOp.Vehicle = playerVehicle; inOp.HasStarted = true; } else { Opponents.Add(new Opponent(client) { Vehicle = playerVehicle, HasStarted = true }); } } }
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; API.setEntityPosition(client.CharacterHandle, position); Vector3 newDir = null; if (race.Checkpoints.Length >= 2) { Vector3 dir = race.Checkpoints[1].Subtract(race.Checkpoints[0]); dir = dir.Normalize(); newDir = dir; } var nextPos = race.Checkpoints[0]; if (newDir == null) { API.triggerClientEvent(client, "setNextCheckpoint", nextPos, true, false); } else { API.triggerClientEvent(client, "setNextCheckpoint", nextPos, false, false, newDir, race.Checkpoints[1]); } var playerVehicle = API.createVehicle(selectedModel, position, new Vector3(0, 0, heading), 0, 0); Thread.Sleep(500); API.setPlayerIntoVehicle(client, playerVehicle, -1); if (freeze) { API.setEntityPositionFrozen(client, playerVehicle, true); } Opponent inOp = Opponents.FirstOrDefault(op => op.Client == client); lock (Opponents) { if (inOp != null) { inOp.Vehicle = playerVehicle; inOp.HasStarted = true; } else { Opponents.Add(new Opponent(client) { Vehicle = playerVehicle, HasStarted = true }); } } }
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); } }