Пример #1
0
        /*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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }