/*private int CalculatePlayerPositionInRace(Client player) * { * int output = 0; * int playerCheckpoint = _currentRace.Checkpoints.Length - _checkpoints.Count; * * int beforeYou = _rivalCheckpointStatus.Count(tuple => tuple.Item2 > playerCheckpoint); * output += beforeYou; * * var samePosAsYou = _rivalCheckpointStatus.Where(tuple => tuple.Item2 == playerCheckpoint); * output += * samePosAsYou.Count( * tuple => * (_currentRace.Checkpoints[playerCheckpoint] - tuple.Item1.Vehicle.Position).Length() < * (_currentRace.Checkpoints[playerCheckpoint] - Game.Player.Character.Position).Length()); * * return output; * }*/ private void SetPlayerInVehicle(Client player, int model, Vector3 pos, float heading, bool freeze) { Program.ServerInstance.SetNativeCallOnTickForPlayer(player, "RACE_REQUEST_MODEL", 0x963D27A58DF860AC, model); Thread.Sleep(5000); Program.ServerInstance.RecallNativeCallOnTickForPlayer(player, "RACE_REQUEST_MODEL"); Program.ServerInstance.GetNativeCallFromPlayer(player, "spawn", 0xAF35D0D2583051B0, new IntArgument(), delegate(object o) { Program.ServerInstance.SendNativeCallToPlayer(player, 0xF75B0D629E1C063D, new LocalPlayerArgument(), (int)o, -1); if (freeze) { Program.ServerInstance.SendNativeCallToPlayer(player, 0x428CA6DBD1094446, (int)o, true); } Opponent inOp = Opponents.FirstOrDefault(op => op.Client == player); lock (Opponents) { if (inOp != null) { inOp.Vehicle = (int)o; inOp.HasStarted = true; } else { Opponents.Add(new Opponent(player) { Vehicle = (int)o, HasStarted = true }); } } Program.ServerInstance.SendNativeCallToPlayer(player, 0xE532F5D78798DAAB, model); }, model, pos.X, pos.Y, pos.Z, heading, false, false); }
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); } }
public override bool OnChatMessage(Client sender, string message) { if (message == "/votemap" && !IsVoteActive() && (!IsRaceOngoing || DateTime.UtcNow.Subtract(RaceStart).TotalSeconds > 60)) { StartVote(); return(false); } else if (message.StartsWith("/vote")) { if (DateTime.Now.Subtract(VoteStart).TotalSeconds > 60) { Program.ServerInstance.SendChatMessageToPlayer(sender, "No current vote is in progress."); return(false); } var args = message.Split(); if (args.Length <= 1) { Program.ServerInstance.SendChatMessageToPlayer(sender, "USAGE", "/vote [id]"); return(false); } if (Voters.Contains(sender)) { Program.ServerInstance.SendChatMessageToPlayer(sender, "ERROR", "You have already voted!"); return(false); } int choice; if (!int.TryParse(args[1], out choice) || choice <= 0 || choice > AvailableChoices.Count) { Program.ServerInstance.SendChatMessageToPlayer(sender, "USAGE", "/vote [id]"); return(false); } Votes[choice]++; Program.ServerInstance.SendChatMessageToPlayer(sender, "You have voted for " + AvailableChoices[choice].Name); Voters.Add(sender); return(false); } else if (message == "/q") { Opponent curOp = Opponents.FirstOrDefault(op => op.Client == sender); if (curOp != null) { if (curOp.Blip != 0) { Program.ServerInstance.SendNativeCallToPlayer(sender, 0x45FF974EEE1C8734, curOp.Blip, 0); //Program.ServerInstance.SendNativeCallToPlayer(sender, 0x86A652570E5F25DD, new PointerArgumentInt() {Data = curOp.Blip}); } lock (Opponents) Opponents.Remove(curOp); } Program.ServerInstance.KickPlayer(sender, "requested"); return(false); } return(true); }