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

        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
                });
            }
        }
    }
Пример #3
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);
            }
        }