Esempio n. 1
0
        private static Rage.Object[] CreateConesAtVehicleSide(Vehicle vehicle, float distanceFromVehicle, bool freezeConesPosition, bool createSideCones, bool createFrontCones, bool createRearCones, Vector3 sidePosition, Vector3 sideVector)
        {
            // TODO: CreateConesAtVehicleSide(): make the vehicles go around the cones instead of ramming into them
            List <Rage.Object> cones      = new List <Rage.Object>();
            Action <Vector3>   createCone = (pos) =>
            {
                Rage.Object o = new Rage.Object("prop_mp_cone_02", pos);
                float?      z = World.GetGroundZ(o.Position, false, true);
                if (z.HasValue)
                {
                    o.SetPositionZ(z.Value);
                }
                o.IsPositionFrozen = freezeConesPosition;
                cones.Add(o);
            };


            float   length        = vehicle.Length;
            Vector3 forwardVector = vehicle.ForwardVector;

            const float separation = 2.0f;

            if (createSideCones)
            {
                // create cones at the side of the vehicle
                createCone(sidePosition + (sideVector * distanceFromVehicle)); // middle cone
                for (float i = separation, j = -separation; i < (length / 2); i += separation, j -= separation)
                {
                    createCone(sidePosition + (sideVector * distanceFromVehicle) + (forwardVector * i)); // from middle to front cones

                    createCone(sidePosition + (sideVector * distanceFromVehicle) + (forwardVector * j)); // from middle to rear cones
                }
            }

            float   width         = vehicle.Width;
            Vector3 rearPosition  = vehicle.RearPosition;
            Vector3 frontPosition = vehicle.FrontPosition;

            float rearFrontConesdistanceFromVehicle = distanceFromVehicle * 2 + length / 2;

            // create cones at the front and rear, going from one side to the other
            for (float i = -(width / 2) - distanceFromVehicle; i < (width / 2); i += separation / 2)
            {
                if (createRearCones)
                {
                    createCone(rearPosition + (forwardVector * -(rearFrontConesdistanceFromVehicle + (i * separation))) + (sideVector * -i)); // rear cones
                }
                if (createFrontCones)
                {
                    createCone(frontPosition + (forwardVector * (rearFrontConesdistanceFromVehicle + (i * separation))) + (sideVector * -i)); // front cones
                }
            }

            return(cones.ToArray());
        }
Esempio n. 2
0
        public static void dropSign(string selectedSign, bool swapHeading, Vector3 Location, float HeadingModifier)
        {
            GameFiber.StartNew(delegate
            {
                try
                {
                    //string selectedCone = barriersToChooseFrom[EntryPoint.rnd.Next(barriersToChooseFrom.Length)];
                    //string selectedCone = "PROP_MP_ARROW_BARRIER_01";
                    if (TrafficPolicerHandler.IsLSPDFRPlusRunning)
                    {
                        API.LSPDFRPlusFunctions.AddCountToStatistic(Main.PluginName, "Road signs placed");
                    }
                    Rage.Object trafficCone  = new Rage.Object(selectedSign, Location);
                    trafficCone.IsPersistent = true;
                    trafficCone.IsInvincible = true;
                    trafficCone.Rotation     = RotationToPlaceAt;
                    if (swapHeading)
                    {
                        trafficCone.Heading = Game.LocalPlayer.Character.Heading + 180f;
                    }
                    trafficCone.Heading += HeadingModifier;

                    trafficCone.IsPositionFrozen = false;
                    if (TrafficSignPreview.Exists())
                    {
                        TrafficSignPreview.SetPositionZ(TrafficSignPreview.Position.Z + 3f);
                    }
                    int waitCount = 0;
                    while (trafficCone.HeightAboveGround > 0.01f)
                    {
                        trafficCone.SetPositionZ(trafficCone.Position.Z - (trafficCone.HeightAboveGround * 0.75f));
                        waitCount++;
                        if (waitCount >= 1000)
                        {
                            break;
                        }
                    }

                    if (trafficCone.Exists())
                    {
                        trafficCone.IsPositionFrozen = true;
                        roadSignsDropped.Add(trafficCone);
                        UInt32 handle = World.AddSpeedZone(trafficCone.Position, 5f, 5f);
                        speedZones.Add(handle);
                        Rage.Object invWall  = new Rage.Object("p_ice_box_01_s", trafficCone.Position);
                        invWall.IsPersistent = true;
                        Ped invPed           = new Ped(trafficCone.Position);
                        invPed.MakeMissionPed();
                        invPed.IsVisible        = false;
                        invPed.IsPositionFrozen = true;

                        invWall.Heading   = Game.LocalPlayer.Character.Heading;
                        invWall.IsVisible = false;
                        RoadSignsWithInvisWallsAndPeds.Add(trafficCone, invWall, invPed);
                    }
                }
                catch (Exception e)
                {
                    Game.LogTrivial(e.ToString());
                }
            });
        }